我想拥有一个Java应用程序,该应用程序运行Scalabench的不同基准。我想确保在我开始测量基准运行多长时间之前对JVM进行热身。我应该如何从Java应用程序运行这些基准?
我想到的第一件事是使用
在循环中执行Scalabench的罐子Process proc = Runtime.getRuntime().exec("java -jar scalabench.jar testname");
,但我认为如果它有助于JVM热身,因为我认为JVM会在for循环的每一个迭代中加载罐子。
下一个可能性是将scalabench.jar
添加为我项目的依赖性,并在for循环中调用其main()
方法以运行测试。我认为在这种情况下,加热JVM不应该是一个问题,因为它在我的应用程序内运行,并且在每次迭代后都不会被杀死。
奖励:我可以使用JMH从Scalabench测量测试?
迄今为止,"加热JVM"的类比是不正确的,以至于它不是一个单一的实体,而是您提高温度均匀的温度。它被称为Hotspot JVM是有原因的。
热身意味着将瞬态启动行为的应用程序带入稳态模式。这涉及许多事情,例如收集初始化期间垃圾,堆沉降到其(希望(稳态尺寸,jits在最高优化层中发射优化的代码,用于最热的代码路径,而没有启动,io caches填充,外部,根据您确切的基准测试,获取的资源等等。
非常通用的食谱是在循环中进行热身,然后使用相同的代码和数据运行基准,也可以在循环中收集多个样本。可以从样本的统计属性中得出多少次迭代,例如方差。
对于微基准,这可能是不足的(在其他各种问题中解释(,因为其他并发症(例如基准顺序(与JVM中影响优化行为的其他并发症,从而使结果混淆。JMH的确旨在解决它们。