我需要测试从gc(垃圾收集)的角度来存储我的域对象和索引的不同方法。
(与我的问题Will GC be much slower if i have mulitple references for each of millions of my business objects?相关)
这有意义吗?
long start = System.currentTimeMillis();
System.gc();
long time = start - System.currentTimeMillis();
如何正确地做到这一点?
答案 0 :(得分:4)
不,这绝对没有意义;请参阅我的回答here和this question。
由于GC 非确定性,您只能真正衡量一段时间内的平均值。
VisualVM有各种用于监控GC活动的工具。新的Mission Control在flight recorder运行时分析工具套件中拥有更强大的工具。
请注意,飞行记录仪需要附有许可条件的-XX:+UnlockCommercialFeatures
标志:
商业功能您不得使用商业功能 在内部运行程序,Java小程序或应用程序 商业运作或任何商业或生产目的,或 用于除B部分,C部分,D部分和E部分以外的任何目的 这些补充条款。如果您要使用商业功能 出于本协议允许范围以外的任何目的,您必须 从Oracle获得单独的许可证。
基本上,您无法在生产中使用商业功能。更多信息here。
这将允许您测量此类事物和运行的集合数量,GC的CPU使用率。创建的对象数,对象引用数,清除数。
但问题仍然存在,GC的运行非确定性。
您需要创建运行一段时间的真实世界测试套件。您需要从代码中收集指标,例如响应时间和监控方的指标。几个小时是好的。一天比较好。
一旦你有了这个,你就可以相当确定哪种GC最适合你的应用。
答案 1 :(得分:1)
首先,在您进行基准测试时,您应该使用System.nanoTime()
而不是System.currentTimeMillis
。
但我不会时间System.gc()
,因为这种方法绝对没有保证。这只是对系统的一个建议。
JVM附带非标准选项来显示GC活动。例如,HotSpot(标准的JVM Oracle推出)has options -XX:+PrintGCDetails
和-XX:+PrintGCTimeStamps
。如果你想要处理GC活动,我会使用它们,而不是滚动你自己的版本。
答案 2 :(得分:0)
我希望您得到相当无用的结果,因为您可能会一直触发完整的gc运行,但在真实系统上,gc将使用基于非平凡逻辑的不同类型的运行。
所以我会使用gc的记录来收集数字。