java - JMH:无效的初始堆大小

标签 java jvm jvm-arguments microbenchmark jmh

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

问题:

  1. 为什么 JMH 不接受堆大小配置?
  2. 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 使用 Runtime.exec(String[])启动一个 fork 的虚拟机。此方法假定每个数组项有一个命令行标记,并且它将正确转义标记内的空格。

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

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

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

关于java - JMH:无效的初始堆大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23884486/

相关文章:

java - Jasmin 汇编器验证错误 : Expecting to find object/array on stack

jvm - 减小 JRE 的大小

java - 知道为什么 jvm 选项以 -XX :? 为前缀吗

java - 在 Java 8 中,它显示为默认情况下没有选择可用的 4 个收集器 (GC)

解析包含德语变音符号 (äöüß) 的文件时引发 JavaParser 异常 'Lexical error'

java - 在 java 中使用 CPP 枚举常量

java - 如何在 OpenJDK 中禁用自旋锁同步

java - 在服务器上运行时设置类的参数

java - PagerSlidingTabStrip:ViewPager 选项卡右对齐

java - Hibernate 5 隐式策略和唯一键