1

我想要一个 java 应用程序,它运行Scalabench的不同基准。我想确保在开始测量基准测试运行多长时间之前预热 JVM。我应该如何从我的 java 应用程序运行这些基准测试?

我想到的第一件事是在 for 循环中使用 Scalabench 的 jar

Process proc = Runtime.getRuntime().exec("java -jar scalabench.jar testname");

但我不认为它是否有助于 JVM 预热,因为我认为 JVM 会在 for 循环的每次迭代中加载 jar。

下一种可能性是将scalabench.jar作为依赖项添加到我的项目中,并main()在 for 循环中调用其方法来运行测试。我认为在这种情况下,预热 JVM 应该不是问题,因为它在我的应用程序中运行,并且在每次迭代后不会被杀死。

奖励:我可以使用JMH来测量来自 Scalabench 的测试吗?

4

1 回答 1

3

到目前为止,“预热 JVM”的类比是不正确的,因为它不是您要达到统一温度的单个实体。它被称为热点 JVM 是有原因的。

预热意味着将应用程序从瞬态启动行为转变为稳态模式。这涉及许多事情,例如在初始化期间收集垃圾、堆稳定到其(希望的)稳定状态大小、JIT 在最高优化层中为最热的代码路径发出优化的代码,而不会因启动而污染配置文件、IO 缓存已填充、外部获取的资源等等,具体取决于您的基准测试。

对此非常通用的方法是在循环中运行 a 的热身,然后使用相同的代码和数据运行基准测试,也在循环中收集多个样本。它需要多少次迭代可以从样本的统计属性中得出,例如方差。

对于微基准测试,这可能是不够的(在其他各种问题中进行了解释),因为 JVM 中的基准测试顺序等额外的复杂性会影响优化行为,从而混淆结果。JMH 确实旨在解决这些问题。

于 2018-02-20T19:27:28.523 回答