2009-09-29 3 views
32

Я запускаю тесты, которые запускают несколько процессов JVM. Сводное время запуска JVM довольно значимо по сравнению со временем фактических тестов, которые запускаются внутри JVM. Как ускорить процесс?Как ускорить запуск Java VM (JVM)?

Я уже использовал опцию «-client», это помогает, но не так сильно, как я хотел. Есть ли другой способ, скажем, предустановить кучу JVM и каким-то образом использовать их?

ответ

2

Почему бы не загрузить все тесты в одном JVM? Можете ли вы сделать одно или несколько из следующего?

  1. загрузить все тесты через класс более высокого уровня?
  2. укажите классы тестов в списке (файл конфигурации) и загрузите каждую последовательность через Class.forName()?
  3. , если изоляция имеет важное значение, вы можете создать другой загрузчик классов на тест

Если распределение памяти внушительно, это может ускорить процесс, определяя размер запуска памяти виртуальной машины Java на тот же рисунок, как максимальная распределяемую память (-Xms vs -Xmx), что позволит сохранить JVM, чтобы вернуться в ОС для большей памяти. Однако в этом сценарии я думаю, что это вряд ли будет проблемой.

1

Запуск тестов с использованием Java 5 или выше. Время запуска значительно сократилось для Java 5.

Вы не можете получить гораздо быстрее, если не сможете повторно использовать запущенную виртуальную машину: предварительная загрузка большого количества из них и последующее выполнение одного теста в каждом случае не ускорят ваши тесты ,

Итак, вам нужно указать способ запуска нескольких тестов в одной виртуальной машине.

0

Если вам действительно необходимо создать отдельную виртуальную машину для каждого теста, лучшим вариантом является, вероятно, убедиться, что вы используете один из новейших выпусков VM от Sun. Время запуска значительно сократилось по сравнению с последними версиями Java и с 1.6.0_16, простая программа «Hello world» занимает около 0,2 с для работы в моей системе.

Если ваш вопрос скорее был «как выполнить больше тестов на одной виртуальной машине», самый простой подход зависит от того, какую тестовую структуру вы используете (если вы не используете фреймворк, вы действительно должны это учитывать) , С помощью JUnit и, возможно, муравьиной цели для JUnit вы можете использовать шаблоны для соответствия тестам, которые вы хотите запустить, или, альтернативно, присоединиться к различным тестовым классам в тестовом наборе, который затем может быть запущен на одной виртуальной машине.

2

Чтобы добавить к тому, что было сказано другими, следующая версия Java ( Java 7 Java 8 Java 9) следует добавить новое улучшение в JVM время запуска, из-за модульности платформы, согласно до this link.

Цитата:

Одним из преимуществ является то, что модульность платформы меньше загрузки, потенциально улучшая запуск производительности. Имея меньшую память footprint также позволяет значительно улучшить производительность, особенно для настольных приложений.

+4

По-видимому, это отложено до тех пор, пока JDK 8. (источник: http://openjdk.java.net/projects/jdk7/features/) – Calvin

+1

Я действительно хочу, чтобы проект Монета или что-то, что они использовали для модуляции основных библиотек, не было всегда отталкиваясь назад. Мне бы хотелось увидеть сокращение кода базовой библиотеки, отбросив Enumeration и другие ранние ложные запуски. –

+1

После «некоторого» времени он, наконец, подходит к Java 9: ​​D – thatsIch

31

Если вы хотите повторно использовать JVM, «как-то» может быть Nailgun. Nailgun поддерживает JVM, а затем использует легкий собственный клиент для запуска определенного класса и обработки консоли io. Это полезно для запуска небольших утилит Java командной строки, но при повторном использовании того же JVM можно накапливать состояние.

Чтобы обойти накопление штата, за счет запуска нескольких JVM, другой вариант - Drip. Drip сохраняет новую JVM в резерве с правильной дорожкой классов и другими параметрами JVM, чтобы вы могли быстро подключиться и использовать ее по мере необходимости, а затем выбросить. Капельница хэширует параметры JVM и сохраняет информацию о том, как подключиться к JVM в каталоге с хеш-значением в качестве его имени.

+0

+1 - интересный –

+0

Nailgun действительно uber-awesome. –

1

Производительность запуска JVM может быть улучшена по-разному: CDS, прямое регулирование, пиннинг CPU и jlink (с JDK 9) могут быть хорошими вариантами. AOT (JDK 9, только для Linux) имеет некоторые грубые грани, но может быть настроен на то, чтобы помочь небольшим приложениям.

CDS

класса Обмен данными был разработан для клиента VM назад в 1,5 раза, но был значительно улучшен, так как работать на всех вариантах HotSpot (все ШС с 8), в результате чего существенный импульс запуска производительности при включен.

CDS всегда включен на 32-битных установках JRE клиента, но, возможно, потребуется несколько шагов вручную включить в других местах:

  1. Run java -Xshare:dump для генерации CDS общего архива
  2. Добавить -Xshare:auto вашей команды к убедиться, что он используется

Другие настройки

Хотя -client может или не может фактически сделать anythi нг (виртуальная машина на многих системах не не поставляются с клиентской VM - ни с 9, на самом деле), существует множество способов настройки на HotSpot сервер JVM, чтобы вести себя как клиент VM:

  • Используйте только С1 (клиент) компилятор: -XX:TieredStopAtLevel=1
  • Использование в качестве несколько компилятора нитея, как это возможно: -XX:CICompilerCount=1
  • Используйте однопоточный последовательные ОЕ: -XX:+UseSerialGC
  • использование Предела куча (особенно в больших системах), например, -Xmx512m

Этого должно быть достаточно, чтобы ускорить запуск небольшого приложения с коротким сроком действия, но может иметь очень негативные последствия для максимальной производительности. Вы можете, конечно, получить еще больше, отключив функции, которые вы, возможно, не используете, например -XX:-UsePerfData (отключает некоторую информацию о времени выполнения, которая может быть получена с использованием MXBeans и jvmstat).

Расширенный

  • jlink новый инструмент, доступный в Java 9, который позволяет создавать пользовательские среды выполнения изображений. Если ваше консольное приложение использует только небольшое подмножество модулей JDK, пользовательское время выполнения может быть сделано очень маленьким, что может улучшить время запуска. Минимальное изображение, включающее только java.базовый модуль, и может увеличить время запуска на ~ 10-20ms в зависимости от аппаратного обеспечения и другой настройки: $JAVA_HOME/bin/jlink --add-modules java.base --module-path $JAVA_HOME/jmods --output jbase

  • (Linux только) Java 9 вводит экспериментальную AOT compiler, jaotc, которые могут быть использованы, чтобы помочь приложениям загружаться быстрее и тратить намного меньше циклов. Из-за коробки он может замедлить немедленный запуск (поскольку код AOT'd является общей библиотекой, которая добавляет свои собственные накладные расходы ввода-вывода, не поддерживает Serial GC ..), но при тщательной настройке мы, Видно, что он сокращает время запуска небольших приложений на 15-30%.

  • CPU pinning: на больших системах мы видели эффекты, которые возникают из-за трафика когерентности кеш-памяти между сокетами, а привязка к одному узлу CPU может значительно сократить время запуска. В Linux что-то вроде numactl --cpunodebind=0 $JAVA_HOME/bin/java ... должно сделать трюк.

В целом мы смогли получить минимальные приложения для выполнения всего за 35 мс (JDK 9 GA). В ветку JDK10 вошли различные оптимизации запуска, и теперь я вижу цифры всего 28 мс.

Смежные вопросы