Подтвердить что ты не робот

Java/JVM (HotSpot): Есть ли способ сохранить прирост производительности JIT во время компиляции?

Когда я измеряю пропускную способность моего приложения Java, я вижу увеличение производительности на 50% с течением времени:

  • Для первых сообщений 100K я получаю ~ 3000 сообщений в секунду
  • Для вторых сообщений 100K я получаю ~ 4,500 сообщений в секунду.

Я считаю, что производительность улучшается, так как JIT оптимизирует путь выполнения.

Причина, по которой не сохраняется компиляция JIT, заключается в том, что "оптимизация, выполняемая JVM, не является статической, а скорее динамической, на основе шаблонов данных, а также шаблонов кода. Вероятно, эти шаблоны данных будут меняться во время срок службы приложения, делая оптимизацию кэширования менее оптимальной".

Тем не менее, я знаю, что эти шаблоны данных не будут меняться во время моего жизненного цикла приложения или даже в течение нескольких жизненных циклов приложений. Итак, как я могу "сохранить" эти приросты производительности в JVM HotSpot?

См. также question и обсуждение.

4b9b3361

Ответ 1

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

Ответ 2

Используйте '-сервер', чтобы сделать намного больше вперед. Точка доступа не так, насколько я знаю, позволяет сохранять jit-информацию между прогонами, поэтому -server - это самый простой способ рассказать ей, что вы хотите.

Ответ 3

Вы уверены, что это связано с процессором, а не с IO? Я видел это поведение много раз, когда попадание в холодный кеш ухудшает производительность.

Ответ 4

Несколько вариантов настройки JIT.

1. Обмен данными класса http://publib.boulder.ibm.com/infocenter/javasdk/v6r0/index.jsp?topic=%2Fcom.ibm.java.doc.user.aix64.60%2Fuser%2Fclassdatasharing.html

2. Многоуровневая компиляция Подробнее см. Флаг -XX: + TieredCompilation

3. Custom CompileThreshold Контролирует количество вызовов функции, которая сделала бы ее пригодной для компиляции JIT. Подробнее см. Флаг -XX: CompileThreshold. Никогда не делайте это с помощью ZERO или ONE. Ваше вмешательство здесь может привести к ухудшению производительности. Однако JVM дает вам возможность. -server устанавливает значение 10000.