JMH:初始堆大小无效

时间:2014-05-27 08:25:34

标签: java jvm jvm-arguments microbenchmark jmh

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

问题:

  1. 为什么JMH不接受堆大小配置?
  2. JMH是否在没有jvmArgs方法的情况下吸收了想法堆大小设置?
  3. 错误:

    # 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
    

1 个答案:

答案 0 :(得分:7)

JMH使用Runtime.exec(String[])启动分叉VM。此方法假设每个数组项都有一个命令行标记,它将正确地转义标记内的空格。

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

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

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