如何微写Java垃圾收集器?

时间:2014-04-05 09:18:22

标签: java garbage-collection

我需要测试从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();

如何正确地做到这一点?

3 个答案:

答案 0 :(得分:4)

不,这绝对没有意义;请参阅我的回答herethis question

由于GC 非确定性,您只能真正衡量一段时间内的平均值。

VisualVM有各种用于监控GC活动的工具。新的Mission Controlflight 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的记录来收集数字。