我想要一个 java 应用程序,它运行 Scalabench 的不同基准测试.我想确保 JVM 在开始测量基准运行时长之前已预热。我应该如何从我的 Java 应用运行这些基准测试?
我想到的第一件事是使用 for 循环在 for 循环中执行 Scalabench 的 jar
Process proc = Runtime.getRuntime().exec("java -jar scalabench.jar testname");
但我不认为它是否有助于 JVM 预热,因为我认为 JVM 会在 for 循环的每次迭代中加载 jar。
下一个可能性是将scalabench.jar
作为依赖项添加到我的项目中,并在for 循环中调用其main()
方法来运行测试。我认为在这种情况下预热 JVM 应该不是问题,因为它在我的应用程序内部运行并且不会在每次迭代后被杀死。
奖励:我可以使用 JMH 吗?从 Scalabench 测量测试?
最佳答案
到目前为止,“预热 JVM”的类比是不正确的,因为它不是您要使其达到统一温度的单个实体。它被称为热点 JVM 是有原因的。
预热意味着将应用程序从 transient 启动行为带入稳态模式。这涉及许多事情,例如收集初始化期间的垃圾,堆稳定到其(希望)稳态大小,JIT 在最高优化层中为 HitTest 的代码路径发出优化代码,而没有配置文件从启动时被污染,IO 缓存已填充,外部获取的资源等等,具体取决于您进行基准测试的具体内容。
此方法的一般方法是在循环中运行预热,然后使用相同的代码和数据运行基准测试,同样在循环中收集多个样本。可以从样本的统计特性(例如方差)中得出需要多少次迭代。
对于微基准测试,这可能是不够的(在其他各种问题中有解释),因为 JVM 中影响优化行为的基准顺序等额外的复杂性,从而混淆了结果。 JMH 确实致力于解决这些问题。
关于java - 预热 JVM 以运行 Scalabench,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48866844/