2010-09-23 3 views
11

Когда я измерить производительность моего приложения Java, я вижу увеличение 50% производительности с течением времени:Java/JVM (HotSpot): Есть ли способ сохранить прирост производительности JIT во время компиляции?

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

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

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

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

См. Также соответствующие question и discussion.

+0

Это немного глупый комментарий, но я собираюсь сказать это в любом случае, чтобы помочь дебатам - мне как интересно узнать ответ, как и все остальные! :) Я бы предположил, что определенные оптимизации, выполняемые JVM, будут зависеть от обрабатываемых данных. Если ваши данные не идентичны (включая время, в которое оно поступило), выполненные оптимизации могут быть разными каждый раз.Если данные всегда одни и те же, то вам нужно только запустить приложение один раз :) – Rich

+0

Существует также это: http://stackoverflow.com/questions/2178640/is-there-a-way-to-save-the- java-jit-information-for-the-next-run-so-that-i-dont – Rich

+0

Если бы вы знали, какие оптимизации использует VM с вашим кодом, и вы знаете, что шаблоны данных не изменятся, возможно ли это для вас использовать то, что было оптимизировано, и изменить логику вашего приложения, чтобы отразить это? –

ответ

6

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

+0

Блестящая идея! – Rich

+0

Я не использую Nailgun, но это кажется лучшей идеей. – Rudiger

+1

Nailgun отбрасывает все понятия безопасности, это может или не имеет значения для вас. –

3

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

2

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

2

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

+0

Функция совместного использования данных класса - насколько я знаю, характерная для IBM JVM. –

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