如何使用微基准java垃圾收集器?

如何使用微基准java垃圾收集器?,java,garbage-collection,Java,Garbage Collection,我需要从gc(垃圾收集)的角度测试存储域对象和索引的不同方法 (与我的问题有关) 这有什么意义吗 long start = System.currentTimeMillis(); System.gc(); long time = start - System.currentTimeMillis(); 如何正确地做这件事?不,这毫无意义;看看我的答案和答案 由于GC是非确定性的,因此您只能真正测量一段时间内的平均值 具有各种用于监视GC活动的工具。新版本在运行时分析工具套件中有更强大的工具 请注

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

(与我的问题有关)

这有什么意义吗

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

如何正确地做这件事?

不,这毫无意义;看看我的答案和答案

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

具有各种用于监视GC活动的工具。新版本在运行时分析工具套件中有更强大的工具

请注意,飞行记录器需要带有许可条件的
-XX:+UnlockCommercialFeatures
标志:

商业功能您不能将商业功能用于 在内部数据库中运行程序、Java小程序或应用程序 商业运营或任何商业或生产目的,或 用于本协议B、C、D和E节规定以外的任何目的 这些补充条款。如果你想使用商业功能 出于本协议允许以外的任何目的,您必须 从Oracle获得单独的许可证

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

这将允许您测量这些事情和运行的集合数量,以及GC的CPU使用率。创建的对象数、对象引用数、清除的对象数

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

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


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

不,这绝对没有意义;看看我的答案和答案

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

具有各种用于监视GC活动的工具。新版本在运行时分析工具套件中有更强大的工具

请注意,飞行记录器需要带有许可条件的
-XX:+UnlockCommercialFeatures
标志:

商业功能您不能将商业功能用于 在内部数据库中运行程序、Java小程序或应用程序 商业运营或任何商业或生产目的,或 用于本协议B、C、D和E节规定以外的任何目的 这些补充条款。如果你想使用商业功能 出于本协议允许以外的任何目的,您必须 从Oracle获得单独的许可证

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

这将允许您测量这些事情和运行的集合数量,以及GC的CPU使用率。创建的对象数、对象引用数、清除的对象数

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

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


一旦你有了它,你就可以相当确定哪个GC最适合你的应用程序了。

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


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

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


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

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

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


JVM提供了非标准选项来显示GC活动。例如,HotSpot(Oracle推出的标准JVM)
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
。如果你想控制GC活动,而不是滚动你自己的版本,我会使用它们。

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

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

JVM提供了非标准选项来显示GC活动。例如,HotSpot(Oracle推出的标准JVM)
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
。如果您想控制GC活动,而不是滚动您自己的版本,我会使用它们