Java 7 JVM медленнее, чем JRockit 6?
Я был очень заинтересован в обновлении до Java 7 (по моим собственным корыстным причинам). Тем не менее, у нас есть пользователи, которые очень чувствительны к задержке (все должно быть меньше миллисекунды). Я провел простой тест сравнения производительности между 3 различными JVM и обнаружил, что Java 7 намного медленнее. Тест протолкнул несколько простых сообщений через наше приложение. Этот тест представляет собой тест с низкой загрузкой и объемом загрузки, который пропускает одно сообщение каждые несколько секунд. Результаты были (в микросекундах):
- Hotspot 6 (build 24): msgs= 23 avg= 902
- JRockit 6 (R28 b 29): msgs= 23 avg= 481
- Hotspot 7 (build 04): msgs= 34 avg=1130
Стратегия Oracle заключается в объединении JRockit и Hotspot, начиная с Java 7 (поэтому JRockit 6 является последним доступным). У кого-нибудь есть идеи, почему производительность намного хуже? (Следует отметить, что код был скомпилирован под Java 1.6. Не уверен, что это могло бы объяснить это...)
ОБНОВЛЕНИЕ: я проголосовал за закрытие своего собственного вопроса, потому что я вижу из комментариев, что на самом деле я не могу сообщить достаточно информации, чтобы сделать этот вопрос конструктивным. Спасибо всем, кто прокомментировал.
ОБНОВЛЕНИЕ: После большего количества обратной связи я думал, что предоставлю больше информации. Тест всегда после нового старта. Все факторы равны для каждого теста. Единственное, что меняется, это JVM. Повторение теста несколько раз дает последовательный результат. GC не возникало ни в одной итерации теста.
Ниже приведены значения одного из тестовых прогонов. И для JRockit, и для Hotspot 7 было выбрано самое первое значение задержки. JRockit имеет огромное первое значение, но затем очень быстро оптимизируется и устремляется к среднему значению. Точка Hotspot 7 оптимизируется дольше и никогда не опускается до такого низкого уровня, как JRockit. Каждая точка данных представляет микросекунды для чтения сообщения из сокета TCP/IP, выполнения бизнес-логики и записи сообщения в другой сокет. Каждое сообщение идентично, и ни для одного сообщения не вводятся новые пути кода.
2 ответа
Основным направлением этого вопроса было, при прочих равных условиях (включая аргументы JVM), почему один и тот же JAR-код Java работает гораздо медленнее с Hotspot 7 JVM, чем с JRockit 6 и Hotspot 6.
Это привело к нескольким ответам, обеспокоенным тем, правильно ли выбрано время (очевидно, из-за скептицизма людей, что между JVM действительно может быть такой другой результат). Основываясь на многочисленных тестах, я не сомневаюсь, что измерения верны.
Потенциальные ответы, которые я считал возможным:
- Java 7 JVM не выполняет код, скомпилированный в Java 6, так же быстро, как тот же код, скомпилированный в Java 7
- новые аргументы JVM требуются для работы Java 7 в максимально оптимизированном режиме
- Другие люди сравнивали Java 7 с JRockit 6 и видели тот же результат, что и я
Фактически, новое поведение Java 7 JVM в нашем приложении сильно отличается, при прочих равных условиях. Единственное решение состоит в том, чтобы профилировать код относительно виртуальной машины Java 7, чтобы обнаружить, где медленные точки в коде. (И, возможно, в этот момент будет ясно, какова была / есть реальная разница между Java 6 JVM и Java 7 JVM).
Я ценю все комментарии и прошу прощения за то, что не смог предоставить достаточно подробностей для четкого анализа / решения.
JRockit является собственной (чистой C) базой кода, отличной от OpenJDK. Он содержит разные сборщики мусора и совершенно другой JIT-компилятор. Одним из крупных монетизаторов, когда он принадлежал BEA, был GC с малой задержкой, который является довольно продвинутым, даже в некоммерческих вариантах. Значительное количество времени было потрачено на реализацию JRockit в качестве чистой комнаты. Как было сказано в комментариях, это не столько вопрос слияния, сколько переопределение в базе кода HotSpot. Это далеко не быстрый процесс, и некоторые вещи не будут достигнуты вообще, по крайней мере, не в их виде JRockit. Кусочки головоломки не легко помещаются без некоторой подачи по краям, так сказать. JDK7 Hotspot будет хорош в других вещах или в других версиях подобных систем, однако это может компенсировать потерю производительности. Другие приложения могут работать быстрее, чем с JRockit 6.
Если вы заинтересованы в получении дополнительной информации о внутренних компонентах JRockit (или любой другой JVM), настоятельно рекомендуется прочитать книгу "Oracle JRockit - полное руководство". Полное раскрытие, я, вероятно, получаю ~ 2 $ до уплаты налогов в роялти за каждую копию и буду использовать ее для покупки эспрессо.:)