Вашему вниманию предлагается перевод поста Дэйва Дагастина, одного из разработчиков JVM о производительности JVM 6.0.
Вышла Java 6, по нашему мнению, самая быстрая и самая надежная версия. Нашей целью было достичь высокой производительности автоматически ("out-of-box"), без специальных настроек.
Что это значит? Для приемлемого быстродействия вам не потребуется настраивать JVM. Вам не потребуется проводить часы, комбинируя загадочные опции, оптимизируя JVM под ваше приложение. Не придется выяснять, требуется ли приложению повторная настройка опций JVM.
В JDK 6 ("двигателем" которого является открытый продукт HotSpot JVM), удалось добиться следующих показателей:
- На тесте SPECjbb2005 Java 6 на 40% впереди конкурентов на Intel Core и на 30%—на процессоре AMD Opteron.
- На SciMark Java 6 продолжает демонстрировать твердое превосходство в производительности на более чем 40%
- На VolanoMark, Java 6 быстрее версии 5 на 20%
Добиться подобных показателей для Java без настроек было трудной, но интересной задачей. Как известно, задачи клиентских и серверных приложений сильно отличаются друг от друга: клиенту нужен быстрый запуск приложения и скромные требования к памяти, а серверу необходим сильно оптимизированный код, высокая пропускная способность (throughput) приложения и максимально короткие паузы GC.
Настройка хитроумных параметров JVM под конкретный тест, конечно же, увлекательна и результативна. Но до тех пор, пока JVM не будет автоматически включать подобные настройки по ходу выполнения, для конечного пользователя подобный "тюнинг" будет бесполезен. Это является правильной, по нашему мнению, постановкой задачи, и тесты производительности должны ей соответствовать.
Еще раз отмечу, что приведенные ниже результаты тестов демонстрируют JVM в базовом режиме, такой, как она предстанет перед пользователем после инсталляции. Не ставилось цели добиться высоких результатов с помощью ручных настроек.
Ниже приводится сравнение производительности на машинах Dell 2950 и Sun Fire X4200. Компьютер Dell имел пару двухядерных процессоров Intel 5160 (2 ЦП, 4 ядра на 3.0 ГГц) и 16 Гб памяти. В Sun Fire имел два Opteron 280 (2 ЦП, 4 ядра на 2.4 ГГц) и 8 Гб памяти. На обоих компьютерах был установлен RedHat Enterprise Linux 4.0 AS Update 4. Ядро Linux не обновлялось после инсталляции. Версия была 2.6.9-42.ELsmp. Единственной переменной в этом исследовании была сама JVM.
Для сравнения были взяты самые свежие дистрибутивы JVM на момент написания статьи (19 декабря 2006 г.): BEA JRockit был скачан с основного сайта компании, а 64-битная версия—с сайта обновлений. IBM JVM была взята с сайта IBM для разработчиков.
- Sun JDK 1.5.0_10
- 32-bit: java version "1.5.0_10" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_10-b03) Java HotSpot(TM) Server VM (build 1.5.0_10-b03, mixed mode)
- 64-bit: java version "1.5.0_10" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_10-b03) Java HotSpot(TM) 64-Bit Server VM (build 1.5.0_10-b03, mixed mode)
- Sun Java SE 6 build 98
- 32-bit: java version "1.6.0" Java(TM) SE Runtime Environment (build 1.6.0-b105) Java HotSpot(TM) Server VM (build 1.6.0-rc-b99, mixed mode)
- 64-bit: java version "1.6.0" Java(TM) SE Runtime Environment (build 1.6.0-b105) Java HotSpot(TM) 64-Bit Server VM (build 1.6.0-b105, mixed mode)
- IBM JDK 5.0 SR3
- 32-bit: Java(TM) 2 Runtime Environment, Standard Edition (build pxi32dev-20061002a (SR3) ) IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 Linux x86-32 j9vmxi3223-20061001 (JIT enabled) J9VM - 20060915_08260_lHdSMR JIT - 20060908_1811_r8 GC - 20060906_AA) JCL - 20061002
- 64-bit: Java(TM) 2 Runtime Environment, Standard Edition (build pxa64dev-20061002a (SR3) ) IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 Linux amd64-64 j9vmxa6423-20061001 (JIT enabled) J9VM - 20060915_08260_LHdSMr JIT - 20060908_1811_r8 GC - 20060906_AA) JCL - 20061002
- BEA JRockit 5.0_06 R26.4
- 32-bit: java version "1.5.0_06" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05) BEA JRockit(R) (build R26.4.0-63-63688-1.5.0_06-20060626-2259-linux-ia32)
- 64-bit: java version "1.5.0_06" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05) BEA JRockit(R) (build P26.4.1-12-67782-1.5.0_06-20061003-1620-linux-x86_64)
Как было сказано выше, специальной настройки JVM не производилось. Результаты были усреднены: было сделано не менее 10 запусков каждого теста и была выполнена проверка по критерию Стьюдента для обеспечения достоверности результата. Данные были нормированы по результатам 32-битной IBM JDK 5 SR3.
Первый ряд графиков демонстрирует производительность Java на микроархитектуре Intel Core 2. Результаты, приведенные ниже (особенно SPECjbb2005) однозначно демонстрируют коренное различие в философии Sun HotSpot и его конкурентов. Если вы посмотрите на результаты тестирования виртуальной машины, специально настроенной под Core 2, опубликованные конкурентами (например, BEA), то результаты эти будут многообещающими. Однако, эти люди пошли путем настройки конкретных тестов под конкретную платформу, что способно лишь сбить с толку обычного пользователя. Может ли пользователь непосредственно воспользоваться такими же настройками для себя? Если эти настройки так хороши, почему производитель не включил их по умолчанию? Мы выбрали для HotSpot другой путь.
Первый график демонстрирует результаты SPECjbb2005, теста от SPEC, оценивающего производительность серверной Java. Этот тест имитирует трехуровневую клиент-серверную систему с упором на средний уровень. Он стресс-тестирует коллекции Java, операции над BigDecimal и обработку XML. Что особенно приятно, оптимизации, выполненные для SPECjbb2005 немедленно дают знать о себе в других тестах, причем в хорошем смысле. Например, в SPECjappserver2004 и в большом количестве "боевых" примеров рабочей нагрузки сервера наших заказчиков. Результаты были получены в режиме одиночной JVM.

SciMark 2.0—это тест на Java, моделирующий различные вычисления в научных целях. Это еще и тест, где Sun продолжает демонстрировать превосходство в производительности. Он достаточно хорошо проверяет генерацию кода, особенно в небольших вычислительных циклах. Однако, результаты могут сильно зависеть от выравнивания данных и иметь расхождения после различных запусков. Эти расхождения обычно носят бимодальный характер. Тест имеет три режима работы: малый, большой и стандартный, в зависимости от объема данных для обработки. Если после этих слов вечер перестает быть скучным, загляните на сайт SciMark 2.0. В целом, это неплохой набор микротестов (microbenchmarks).
Заметьте, что 32-битные JVM превосходят 64-битные на Intel Core во всех случаях, что отличает их от AMD Opteron (см. ниже), где производительность сильно выигрывает на 64 битах. SciMark 2.0 использует обширный набор данных, и вероятно, что операции с 64-битными указателями создают нагрузку, ограничивающую пропускную способность шины памяти настолько, что это сказывается на результатах. Однако, это всего лишь гипотеза.

Volano имитирует популярный Чат-сервер. Быстрый тест, требующий клиента и сервера. С точки зрения JVM, превалирующей нагрузкой является классический сокетный ввод-вывод Java, который порядком устарел, но борозды не портит. Было бы забавно сделать его в NIO. Часть наших клиентов считают этот тест довольно полезным и поэтому мы продолжаем использовать его. Кроме того, друзья из BEA подсказывают, что Volano—наш самый любимый тест. Спорить трудно. Различия JVM в этом тесте не очень велики, так как тест экологичный и мало мусорит: доля нагрузки здесь GC не велика. BEA JRockit демонстрирует хорошую производительность, на 19% больше базовой. Sun Java SE 6 финиширует первой с 22%.


SciMark 2.0 также впечатляет на AMD Opteron. Нас интересует большой объем данных, т.к. он его воздействие на кэш может выявить ограничения подсистемы памяти. Если ваше приложение перемалывает огромные объемы данных, вам стоит взглянуть на результаты "большого" SciMark на различных JVM и архитектурах.

Последний, но не менее важный тест—Volano на AMD Opteron (нет, нет, это не наш любимый тест!). Java 6 демонстрирует улучшение показателей на 20% по сравнению с 5.0_10, уступая 64-битной BEA JRockit. Приятно.

Дэйв Дагастин
Перевел Кирилл Широков


опубликовал Евгений Май 19, 2007 at 03:08 AM MSD #
опубликовал Kirill Shirokov Май 19, 2007 at 11:03 AM MSD #
опубликовал Евгений Май 19, 2007 at 02:59 PM MSD #
опубликовал Кирилл Май 22, 2007 at 05:10 PM MSD #
Гонял 64-битную серверную Java на Dell PowerEdge 850 c Intel Dual Core на Ubuntu Server 7.04 x86-64 -- под нагрузкой жестко вылетает. И Tomcat и серверное приложение. В клиентском режиме все работает хорошо.
опубликовал null Август 08, 2007 at 03:44 PM MSD #
>Вышла Java 6, по нашему мнению, самая быстрая и
>самая надежная версия. Нашей целью было достичь
>высокой производительности автоматически
>("out-of-box"), без специальных настроек.
Конечно это достигается следующим образом:
1. Определить какие специальные настройки приводит к максиальной производительности на известных бенчмарках
2. Сделать эти специальные настройки дефолтными
Шучу :)
опубликовал Никита Декабрь 06, 2007 at 01:12 PM MSK #