На конференции JavaOne 2013, которая недавно завершилась в Сан-Франциско, компании Microsoft Open Technologies и Azul Systems анонсировали Zulu — порт OpenJDK для облачной платформы Windows Azure. Учитывая, что три месяца назад Oracle и Microsoft объявили о партнёрстве в области облачных технологий, многие ожидали, что именно Oracle выпустит JVM для облачной платформы от Microsoft. Однако такую JVM выпустила Azul Systems, многолетний лицензиат Java SE, известный своими высокопроизводительными решениями для серваков с большими хипами.
В первой части статьи мы попробуем разобраться, кто такой этот Zulu и что нам от него ожидать.Ну а потом мы перейдём к распаковке Zulu Technology Preview и, в качестве побочного эффекта, посмотрим, чем же Oracle так нашпиговала свою JDK, что та весит в полтора раза больше Zulu.
Java: Oracle и IBM? Azul и Microsoft!
Интересные времена наступают. Точнее, уже наступили. В последние полгода Azul и Microsoft как-то сильно активизировались в плане Java, причём именно в России. Посудите сами:
- в апреле на питерской Java-конференции JPoint Azul выступила спонсором, а её VP of Engineering Аня Барски выступила с пленарным докладом, после которого активно поползли слухи о том, что Azul открывает офис в Питере.
- в конце июля Oracle и Microsoft объявляют о партнёрстве в сфере облачных технологий
- в июле слухи об Azul в Питере подтвеждаются
- несколько дней назад на JavaOne Azul и MS Open Tech представляют Zulu
Кто такие Azul
Вообще Azul Systems известна своими высокопроизводительными Java-решениями.
Начали они с того, что сделали свою Java на… железе. Решение называется Azul Vega. Последние версии содержат сотни вычислительных ядер и сотни гигабайт RAM.
TheShade как-то рассказывал байку времён своей работы в Intel. Мол, брали они стандартную бенчмарку, в которой Sun'овская Java давала 4000 попугаев, начинали оптимизировать свою имплементацию и после долгих трудов им удавалось выжать 5000 попугаев. «Ура!», кричали они, и публиковали статью о том, как они уделали сановскую имплементацию аж на 25%. После этого приходили парни из Azul, брали бенчмарку и получали на своей Vega не 4000 и не 5000 попугаев, а миллион. Занавес.
Потом они создали чисто софтовое решение — Zing для Linux. Судя по всему, начиная с какой-то версии Linux 2.6 API Linux стало достаточно для того, чтобы отказаться от железной части и портировать свои лучшие наработки из железной части в софт. Вышло довольно круто. Zing позиционируется как решение для тачек с большими хипами:
- масштабируемое
- low latency, GC без пауз
- и так далее
Как известно, каждая плюшка чего-то стоит. В случае low latency нам всегда приходится жертвовать всем остальнымthroughput'ом. Известный мастер elizarov рассказывал недавно за чаем, что крутых latency они добивались на стенде при загрузке процов на 5%, а уже в районе 10% latency начинал сильно проседать. Возможно, крутаны из Azul могли бы затюнить своё решение гораздо лучше, но речь сейчас вообще не об этом.
Пресс-релиз от Azul
Что же официально говорит нам Azul в своём пресс-релизе?
Во-первых, говорится про Windows Azure. Во-вторых, встречается модное нынче «community-driven». В третьих, говорится про полную совместимость со спецификацией Java SE 7. Значит, эти ребята не сильно разломали OpenJDK, что радует :) Но это всё и так понятно.
Из интересного: Azul будет активно заливать в OpenJDK патчи и багфиксы. То есть, не только пользоваться чужим, но и вносить свой вклад. Это крутое заявление, но не новое. Любой нормальный лицензиат Java так делает хотя бы для того, чтобы избавиться от головной боли.
Представим себе, что у нас есть хитрый лицензиат Вася, который нашёл баг в OpenJDK, пофиксил его в своём форке, но не сказал остальным. Ту бишь, не за бэкпортил. И сидит такой довольный собой. Допустим, через месяц ту же проблему нашёл честный Петя, пофиксил её своим способом и залил в OpenJDK. В итоге при первой же синхронизации с обновлённым OpenJDK у Васи случится
батхёрткофликт в исходниках, с которым нужно будет разбираться. А это то ещё удовольствие.
Глазами Microsoft
В Редмонде тоже не дремлют. Чувак из Microsoft Open Technologies <a href="">пишет на MSDN, что фишка в том, что теперь последние версии OpenJDK 7 для Windows теперь доступна в бинарном виде благодаря Zulu, а в дальнейшем цитирует пресс-релиз Azul.
Пресса
Joab Jackson на ComputerWorld отмечает очевидное: Azul будет дефолтной платформой в Azure для тех, кому Java в Azure нужна как сервис. Кроме того, он упоминает Oracle Cloud, в котором Oracle почему-то не предоставяет Java SE как сервис, а предоставляет как сервис более высокоуровневое решение — Java EE. Типа, деплойте-ка своё JavaEE-приложение в Oracle Cloud, а дальше мы сами разберёмся, как его эффективно выполнять.
Звучит разумно с точки зрения облачной модели c одной стороны и как забивание болта на Java SE с другой. Нужна ли бизнесу Java SE без Java EE? Стоит ли ради неё заморачиваться? Судя по статье, Microsoft отвечает на этот вопрос скорее утвердительно, а Oracle скорее отрицательно. Следует лишь заметить напоследок, что это статья на ComputerWorld, а не официальный релиз Oracle или Microsoft.
www.pcworld.com/article/2049415/microsoft-sails-past-oracle-in-bringing-java-se-to-the-cloud.html
Распаковка
Итак, потрогаем Zulu Technology Preview. На официальном сайте Azul Systems лежит ссылка. Кликаем и, о чудо, перед нами 60-мегабайтный zip-архив. Судя по названию, этот билд собран на OpenJDK 7u25 и заточен под Windows x64. Для справки, Oracle JDK 7u25 под win x64 весит около 90 мегабайт, а Oracle JDK 7u40 аж целых 125 мегабайт. Запускаем:
D:zulu1.7.0_25-7.0.0.0-win64bin>java -version
openjdk version «1.7.0_25»
OpenJDK Runtime Environment (Zulu 7.0.0.0-win64) (build 1.7.0_25-b34)
OpenJDK 64-Bit Server VM (Zulu 7.0.0.0-win64) (build 23.25-b03, mixed mode)
хмм, ну ок. Тогда пройдёмся по внутренностям архива.
Распакованная jdk 1.7.0_25 весит 216 мегабайт, а распакованная zulu 1.7.0_25 весит 136 мегабайт. Где же собака порылась оставшиеся 80 метров?
- папка bin весит в Zulu 1.7 метров против 2.5 в Oracle JDK. Мелочь, но интересно. Заходим внутрь и видим, что названия файлов те же, только вот размеры разные. Большинсво мелких exe-шников у Oracle весит по 16 килобайт, а у Azul — по 9 мегабайт. Такое ощущение, что разница просто в компиляторе, которым эти самые екзешники делали. Ну или в настройках. java.exe и javaw.exe отличаются на 11 кило (185 у Oracle против 174 у Azul). Существенно отличается размер unpack200.exe (177К против 109К). Радует, что хотя бы майкрософтовская msvcr100.dll весит поровну в обоих дистрибутивах :)
- 5-мегабайтной папки db c JavaDB у Azul нету. Зато есть папки demo и sample суммарным весом как раз примерно 5 метров.
- src.zip весит примерно одинаково, по 21 мегабайту
- папка include у Oracle больше на 150К за счёт наличия врапперов вокруг вызовов AccessBridge DLL, нужной для работы Java Accessibility
- jre у Azul меньше на 50 метров: 76 против 126. Заглянем внутрь. jre/bin весит 13 метров против 36. Из крупняка там нету библиотек для упомянутого Java Accessibility (пара мегабайт), JavaFX (я насчитал 15 мегабайт). Ну и по мелочи: JdbcOdbc, JavaWebStart Acivex Control и т.п. Ещё 2 мегабайта отыскалось в jre/lib/fonts. Ещё 15 метров отыскались в jre/lib/jfxrt.jar (классы JavaFX). Ещё 4 метра — в Deploy.jar ...
- Ещё 27 мегабайт в оракловой джаве занимает VisualVM — профилировщик, портированный несколько лет назад из плагина NetBeans в отдельное приложение.
На этом месте я понял, что разница с точки зрения именно файлового содержимого — в том, что Oracle JDK включает пачку собственных проприетарных технологий, поэтому весит сильно больше и сравнение не совсем корректно. В этом смысле, нужно было сравнивать сборки Oracle JDK и OpenJDK под Ubuntu — было бы проще.
Итак, как результат: под капотом у нас применение разных компиляторов под винду (или, по крайней мере, разные настройки одного компилятора) и несколько технологий от Oracle, нужных не всем и раздувающих дистрибутив. Именно для того, чтобы побороть последнюю проблему, в Java SE 8 реализованы Compact Profiles. Я понимаю, что сравнивать две софтины по набору файлов — это полный идиотизм, и нужно копать дальше и запускать всё это, меряться попугаями и т.п. Но это материал для технической статьи, а не обзорной.
Давайте её запустим!
Я взял Dcompiler.jar и…
D:>D:zulu1.7.0_25-7.0.0.0-win64binjava.exe -jar DCompiler.jar
Exception in thread «main» java.awt.HeadlessException
at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:208)
at java.awt.Window.(Window.java:535)
at java.awt.Frame.(Frame.java:420)
at java.awt.Frame.(Frame.java:385)
at javax.swing.JFrame.(JFrame.java:180)
at MainFrame.(MainFrame.java:253)
at Gui.create(Gui.java:18)
at Gui.main(Gui.java:49)Мда, она ещё и Headless. Это значит, что
эти парни выпилили из своей джавы AWT и SwingZulu предназначена только для серверов. IntelliJ IDEA вы на ней не запустите. Вот так.Заключение
Для меня по-прежнему остаётся загадкой, в чём же специфика Zulu. На ум приходит только какое-то потенциальное тесное сотрудничество Azul Systems и Microsoft в плане компиляции и оптимизации нативного кода OpenJDK под винду. Может быть, какие-нибудь навеянные совместными усилиями оптимизации в JIT. Может быть, какие-то куски из Zing, который является продуктом для Linux, будут портированы (или уже портированы) в Zulu.
Почему же Zulu позиционируется именно как решение для Windows Azure, а не просто как сборка OpenJDK под винду. Что это? Маркетинг? Ну ок. А что в Zulu технически нового? Какова специфика Zulu? Хочется верить, что это действительно выльется во что-то интересное технически и даст Java-миру что-то принципиально новое. Пока что я вижу только порт OpenJDK на Windows x64. Что я упустил? Кто из вас что знает про Zulu? Ну же?
В то же время, налицо интересное противоречие между Zing и Zulu. Zing — это продукт для одной большой тачки. А Zulu, как заявлено, продукт для облака, то есть для множества мелких тачек. Чего хочет добиться Azul? Играть на обоих рынках? Можно ли при таком противоречии портировать какие-то решения из Zing в Zulu? Или это просто порт OpenJDK, что называется, без претензий на лидерство? В общем, много интересного. Время покажет.
Ну и вообще — Java в облаке, JVM в облаке. Что это и зачем? Быстрое клонирование работающего рантайма между машинами в облаке? Возможность менять настройки хипа на лету? Автоматический форк инстансов при выполнении каких-то условий? Реализация I/O (диска и сети), оптимизированная для виртуальных машин? В общем, вопросов масса.
Порассуждать на эти и другие темы я приглашаю вас на конференции Joker 2013, которая пройдёт в Питере уже через две недели. Среди прочих, в программе конференции будет доклад от CTO Azul Systems Гила Тини про сборку мусора и доклад от Александра Белоцерковского из Microsoft как раз про Java в Windows Azure. И именно им двоим лично я и хочу задать озвученные выше вопросы.
Автор: 23derevo