为了避免在JVM上进行基准测试的大多数众所周知的陷阱,我使用了jmh(java微基准测试工具(。另外,我确实了解垃圾收集会扭曲基准测试结果。
现在我想知道 jmh 与-prof gc
的结果有多大的表现力。jmh 是否采取特殊行动使结果有意义?
我脑海中的其他问题是:
- 如果在测量过程中没有进行垃圾收集怎么办?
- 如果分析 gc,jmh 会强制垃圾收集吗?
- 在单独的JVM/java进程中运行每个基准对gc分析有什么影响?
另外,我确实了解垃圾收集会扭曲基准测试结果。
它并没有真正扭曲结果。如果代码创建垃圾,则 GC 周期是算法产生的性能成本的一部分。您只是以摊销的方式支付它,而不是按调用支付。当然,基准测试编写者需要确保迭代和预热计数设置为足够大的数量,以便获得有意义的样本,因此,如果您还希望测量GC的影响,则需要运行基准测试足够长的时间,以使GC人体工程学达到稳定状态。
当然,微基准测试就是这样,它不是整个应用程序的基准测试。由于GC成本通常不仅仅取决于分配率(例如,实时集大小是另一个因素(,因此应谨慎解释这些结果。