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

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

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

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

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

Однако я точно знаю, что эти шаблоны данных не изменятся в течение срока службы моего приложения или даже в течение нескольких периодов жизни приложения.Итак, как мне «сохранить» эти приросты производительности в JSM HotSpot?

См. Также соответствующие вопрос и обсуждение .

Ответы [ 4 ]

6 голосов
/ 23 сентября 2010

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

3 голосов
/ 23 сентября 2010

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

2 голосов
/ 27 июля 2012

Еще несколько опций для настройки 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: + Многоуровневая компиляция

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

2 голосов
/ 23 сентября 2010

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

...