繁体   English   中英

如何对Java垃圾收集器进行微基准测试?

[英]How to microbenchmark java garbage collector?

我需要从gc(垃圾收集)的角度测试存储域对象和索引的不同方法。

(与我的问题有关, 如果我对数百万个业务对象都有多个引用,GC会不会慢很多?

这有道理吗?

long start = System.currentTimeMillis();
System.gc();
long time = start - System.currentTimeMillis();

怎么做呢?

不,这绝对没有道理; 在这里看到我的答案和这个问题

由于GC是不确定的,因此您只能真正测量一段时间内的平均值。

VisualVM具有用于监视GC活动的各种工具。 新的Mission Control飞行记录器运行时分析工具套件中具有更强大的工具。

请注意,飞行记录器需要-XX:+UnlockCommercialFeatures标志,该标志附加了许可条件:

商业功能不得将商业功能用于内部业务运行中的程序,Java applet或应用程序的运行,任何商业或生产目的或除B,C,D和E节中规定的目的以外的任何其他目的。补充条款。 如果您要出于本协议所允许的目的以外的任何目的使用商业功能,则必须从Oracle获得单独的许可。

本质上,您不能在生产中使用商业功能。 更多信息在这里

这将使您能够衡量此类情况和运行的收集数量,GC的CPU使用率。 创建的对象数量,对象引用数量,清除的数量。

但是问题仍然在于,GC的运行是不确定的

您需要创建可以运行一段时间的真实测试套件。 您需要从代码中收集指标,例如响应时间和监视端的指标。 几个小时很好。 一天会更好。

一旦有了这个,就可以确定哪个GC最适合您的应用程序。

首先,在进行基准测试时,应该使用System.nanoTime()而不是System.currentTimeMillis

但是我不会为System.gc()计时,因为该方法绝对没有保证。 这只是对系统的建议。

JVM带有非标准选项来显示GC活动。 例如,HotSpot(Oracle推出的标准JVM) 具有 -XX:+PrintGCDetails-XX:+PrintGCTimeStamps 如果您想了解GC活动,而不是滚动自己的版本,我会使用那些。

我希望您会得到无用的结果,因为您可能一直会触发完整的gc运行,但是在实际系统上,gc将基于非平凡的逻辑使用不同类型的运行。

因此,我将使用gc的日志记录来收集数字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM