我需要测试从gc (垃圾收集)的角度来存储域对象和索引的不同方法。
(与我的问题如果我对我的每一个业务对象都有多个引用,GC会慢得多吗?有关)
这说得通吗?
long start = System.currentTimeMillis();
System.gc();
long time = start - System.currentTimeMillis();如何做好呢?
发布于 2014-04-05 09:28:50
因为GC是non-deterministic,所以您只能在一段时间内真正测量平均值。
VisualVM有监视GC活动的各种工具。新的任务控制在运行时分析工具的飞行记录器套件中拥有更强大的工具。
请注意,飞行记录器需要附加许可条件的-XX:+UnlockCommercialFeatures标志:
商业特性不得用于在内部业务操作中运行程序、Java applet或应用程序,或用于任何商业或生产目的,或用于本补充术语B、C、D和E节以外的任何目的。如果您希望将商业特性用于本协议允许的其他目的,则必须从Oracle获得单独的许可证。
本质上,您不能在生产中使用商业特性。更多信息,这里。
这将允许您测量这些事情和集合运行的数量,以及GC的CPU使用情况。创建对象的数量,对象引用的数量,清除的数量。
但是问题仍然存在,GC的运行是non-deterministic.。
您需要创建运行一段时间的真实世界测试套件。您需要从代码中收集度量,比如响应时间和监控端的度量。几个小时就好了。一天更好。
一旦您拥有了这个,您就可以相当肯定哪个GC最适合您的应用程序。
发布于 2014-04-05 09:29:41
首先,当您进行基准测试时,您应该使用System.nanoTime()而不是System.currentTimeMillis。
但我不会给System.gc()计时,因为这种方法绝对没有保证。这只是对系统的一个建议。
JVM提供了非标准选项来显示GC活动。例如,HotSpot (标准JVM发布) 有选择 -XX:+PrintGCDetails和-XX:+PrintGCTimeStamps。如果您想获得GC活动的句柄,而不是滚动您自己的版本,我将使用它们。
发布于 2014-04-05 09:29:26
我预计您会得到相当无用的结果,因为您可能一直都会触发完整的gc运行,但是在实际系统中,gc将使用不同类型的基于非平凡逻辑的运行。
所以我会用gc的日志来收集数字。
https://stackoverflow.com/questions/22878944
复制相似问题