java - 预热 JVM 以运行 Scalabench

标签 java jvm jmh dacapo

我想要一个 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/

相关文章:

java - 无法将 notificationDataSetChanged() 与 RecyclerView 一起使用,导致 NullPointerException

java - 为什么HttpClient执行post方法后停留在登录页面?

java - 理解 Thread.currentThread().getContextClassLoader().getResourceAsStream()

java - 如何增加 java 内存(算法在 ubuntu 上运行,但在 mac 上运行;相同的机器配置)

profiler - JMH 的 DTraceAsmProfiler 在 Mac 上失败并显示 '[sudo: a password is required'

java - 3.0 servlet 中的 Log4J2 配置

Java 整数常量 - 拆箱

clojure - 类型删除如何帮助 Clojure 存在?

java - 在 JMH 中对具有不同值的循环进行微基准测试

java - 测试 Java 反射、方法句柄和镜像性能