Java 卡尺错误:cicompiler计数1无效;必须至少为2

Java 卡尺错误:cicompiler计数1无效;必须至少为2,java,jvm,jvm-arguments,jvm-crash,caliper,Java,Jvm,Jvm Arguments,Jvm Crash,Caliper,我有一个卡尺基准(1.0-beta-2): 我使用以下命令从eclipse或命令行运行它: mvn exec:java -Dexec.mainClass="com.google.caliper.runner.CaliperMain" -Dexec.args="MyBenchmark" 在这两种情况下,我都出现了一个错误: ERROR: Trial failed to complete (its results will not be included in the run): The w

我有一个卡尺基准(1.0-beta-2):

我使用以下命令从eclipse或命令行运行它:

mvn exec:java -Dexec.mainClass="com.google.caliper.runner.CaliperMain" -Dexec.args="MyBenchmark" 
在这两种情况下,我都出现了一个错误:

ERROR: Trial failed to complete (its results will not be included in the run):
  The worker exited without producing data. It has likely crashed. Inspect /tmp/1427055470061-0/trial-1.log to see any worker output.
在这个文件中,我看到:

Trial Number: 1
Trial Id: d663a0b5-55b4-43c3-97d8-93f14f436342
Experiment: {instrument=allocation, benchmarkMethod=a, vm=default, parameters={}}

[stderr] CICompilerCount of 1 is invalid; must be at least 2
[stderr] Error: Could not create the Java Virtual Machine.
[stderr] Error: A fatal exception has occurred. Program will exit.
ubuntu 14.04,java:

java version "1.8.0_40"
Java(TM) SE Runtime Environment (build 1.8.0_40-b25)
Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode)

有没有办法修复它?

这是卡钳中的一个bug。它使用
-XX:CICompilerCount=1
作为默认JVM参数。但是,当启用分层编译时,必须至少有2个编译器线程(一个用于C1,一个用于C2)


尝试使用较大的值手动覆盖
-XX:CICompilerCount

我找到了解决方案。标志
-XX:-tieredcomployment
帮助。它可以直接在microbenchmark java类中使用,如下所示:

import com.google.caliper.api.VmOptions;

@VmOptions("-XX:-TieredCompilation")
public class MyMicrobenchmark {
...

卡钳似乎覆盖了这个设置。这不好,因为它显著地改变了JVM的默认行为,并且打破了基准测试的主要思想:如果在生产中运行不同的东西,那么测量一件东西是没有意义的。我个人建议用卡钳代替卡钳。这个工具是由JVM工程师开发和使用的。非常感谢。在添加VmOption之后,我忘了再次构建类,正因为如此,我花了一个小时才意识到你的帖子有多有用。
import com.google.caliper.api.VmOptions;

@VmOptions("-XX:-TieredCompilation")
public class MyMicrobenchmark {
...