Java 预热JVM以运行Scalabench

Java 预热JVM以运行Scalabench,java,jvm,jmh,dacapo,Java,Jvm,Jmh,Dacapo,我希望有一个java应用程序,它运行。我希望在开始测量基准测试运行的时间之前,确保JVM已经预热。我应该如何从java应用程序运行这些基准测试 我想到的第一件事是在for循环中使用 Process proc = Runtime.getRuntime().exec("java -jar scalabench.jar testname"); 但我不认为这是否有助于JVM预热,因为我认为JVM将在for循环的每个迭代中加载jar 下一种可能是将scalabench.jar作为依赖项添加到我的项目中,

我希望有一个java应用程序,它运行。我希望在开始测量基准测试运行的时间之前,确保JVM已经预热。我应该如何从java应用程序运行这些基准测试

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

Process proc = Runtime.getRuntime().exec("java -jar scalabench.jar testname");
但我不认为这是否有助于JVM预热,因为我认为JVM将在for循环的每个迭代中加载jar

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

额外好处:我可以使用Scalabench来测量测试吗?

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

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

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

对于微基准点来说,这可能是不够的(在各种其他问题中解释),因为额外的复杂性,例如JVM中的基准顺序会影响优化行为,从而混淆结果。JMH的目标是解决这些问题