预热JVM以运行Scalabench

时间:2018-02-19 13:02:50

标签: java jvm jmh dacapo

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

我想到的第一件事是使用

在for循环中执行Scalabench的jar
Process proc = Runtime.getRuntime().exec("java -jar scalabench.jar testname");

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

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

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

1 个答案:

答案 0 :(得分:3)

"使JVM升温的类比"到目前为止它是不正确的,它不是一个单一的实体,你提升到一个统一的温度。它有一个叫做热点JVM的原因。

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

一般的配方是在循环中运行预热,然后使用相同的代码和数据运行基准测试,也在循环中收集多个样本。它可以从样本的统计特性(例如方差)中导出多少次迭代。

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