JMH: неверный начальный размер кучи

1

Я тестирую свою производительность программы с помощью JMH. И не удается настроить размер кучи. Мне интересно, почему это не работает.

Вопросов:

  1. Почему JMH не принимает конфигурацию размера кучи?
  2. jvmArgs ли jvmArgs настройку размера кучи идеи без метода jvmArgs?

Ошибка:

# 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
    Достаточно ли памяти на вашем компьютере для нескольких виртуальных машин, каждая с 2G начальной кучи?
  • 1
    Попробуйте использовать .jvmArgs("-Xms2048m", "-Xmx2048m", "-XX:MaxDirectMemorySize=512M") (vararg с одним элементом для каждого параметра вместо одной строки, содержащей все параметры).
Показать ещё 1 комментарий
Теги:
jvm
microbenchmark
jvm-arguments
jmh

1 ответ

5
Лучший ответ

JMH использует Runtime.exec(String []) для запуска разветвленной виртуальной машины. Этот метод предполагает одиночный токен командной строки для элемента массива, и он будет правильно избегать пробелов внутри токенов.

Это означает, что когда вы передаете "-Xms2048m -Xmx2048m -XX:MaxDirectMemorySize=512M" в качестве аргумента, она рассматривается как единственный аргумент, который содержит пробелы внутри, а не три отдельных аргумента, разделенных пробелом.

Таким образом, правильный способ указать несколько аргументов JVM в JMH - использовать отдельное строковое значение для каждого отдельного аргумента:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню