Java JMH:初始堆大小无效

Java JMH:初始堆大小无效,java,jvm,jvm-arguments,microbenchmark,jmh,Java,Jvm,Jvm Arguments,Microbenchmark,Jmh,我用JMH测试我的程序性能。并且无法配置堆大小。我想知道为什么它不起作用 问题: # Run progress: 0.00% complete, ETA 00:04:30 # VM invoker: /usr/lib/jvm/java-8-oracle/jre/bin/java # VM options: -Xms2048m -Xmx2048m -XX:MaxDirectMemorySize=512M # Fork: 1 of 1 Invalid initial heap size: -Xms2

我用JMH测试我的程序性能。并且无法配置堆大小。我想知道为什么它不起作用

问题:

# Run progress: 0.00% complete, ETA 00:04:30
# VM invoker: /usr/lib/jvm/java-8-oracle/jre/bin/java
# VM options: -Xms2048m -Xmx2048m -XX:MaxDirectMemorySize=512M
# Fork: 1 of 1
Invalid initial heap size: -Xms2048m -Xmx2048m -XX:MaxDirectMemorySize=512M
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
<forked VM failed with exit code 1>
public static void main(String... args) throws RunnerException, IOException {
    Options opt = new OptionsBuilder()
            .include(".*" + ArraySummatorBenchmarking.class.getSimpleName() + ".*")
            .warmupIterations(5)
            .measurementIterations(5)
            .forks(1)
            .jvmArgs("-Xms2048m -Xmx2048m -XX:MaxDirectMemorySize=512M")
            .build();
    new Runner(opt).run();
}
  • 为什么JMH不接受堆大小配置
  • JMH是否在没有
    jvmArgs
    方法的情况下吸收idea堆大小设置
  • 错误:

    # Run progress: 0.00% complete, ETA 00:04:30
    # VM invoker: /usr/lib/jvm/java-8-oracle/jre/bin/java
    # VM options: -Xms2048m -Xmx2048m -XX:MaxDirectMemorySize=512M
    # Fork: 1 of 1
    Invalid initial heap size: -Xms2048m -Xmx2048m -XX:MaxDirectMemorySize=512M
    Error: Could not create the Java Virtual Machine.
    Error: A fatal exception has occurred. Program will exit.
    <forked VM failed with exit code 1>
    
    public static void main(String... args) throws RunnerException, IOException {
        Options opt = new OptionsBuilder()
                .include(".*" + ArraySummatorBenchmarking.class.getSimpleName() + ".*")
                .warmupIterations(5)
                .measurementIterations(5)
                .forks(1)
                .jvmArgs("-Xms2048m -Xmx2048m -XX:MaxDirectMemorySize=512M")
                .build();
        new Runner(opt).run();
    }
    
    idea.vmoptions

    -server
    -Xms2056m
    -Xmx2056m
    -XX:MaxPermSize=1024m
    -XX:ReservedCodeCacheSize=256m
    -ea
    -Dsun.io.useCanonCaches=false
    -Djava.net.preferIPv4Stack=true
    -Djsse.enableSNIExtension=false
    -XX:+UseCodeCacheFlushing
    -XX:+UseConcMarkSweepGC
    -XX:SoftRefLRUPolicyMSPerMB=50
    -Dawt.useSystemAAFontSettings=lcd
    
    主要方法选项:

    -Xms2048m -Xmx2048m -XX:MaxDirectMemorySize=512M
    
    JMH用于启动分叉VM。此方法假定每个数组项有一个命令行标记,它将正确地转义标记内的空格

    这意味着,当您将
    “-Xms2048m-Xmx2048m-XX:MaxDirectMemorySize=512M”字符串作为参数传递时,它将被视为一个恰好包含空格的单个参数,而不是三个单独的空格分隔参数

    因此,在JMH中指定多个JVM参数的正确方法是为每个单独的参数使用单独的字符串值:

    Options opt = new OptionsBuilder()
            ...
            .jvmArgs("-Xms2048m", "-Xmx2048m", "-XX:MaxDirectMemorySize=512M")
            ...
    

    您的计算机是否有足够的内存供多个VM使用,每个VM都有2G的初始堆?请尝试使用
    .jvmArgs(“-Xms2048m”、“-Xmx2048m”、“-XX:MaxDirectMemorySize=512M”)
    (vararg每个选项有一个项目,而不是包含所有选项的单个字符串)。@OlegEstekhin您是对的。它起作用了!