Upload
nikita-lipsky
View
335
Download
1
Embed Size (px)
DESCRIPTION
#JavaDayKiev presentation
Citation preview
Java худеет. Спроси меня как. Никита Липский twi.er: @pjBooms
Excelsior LLC
Java полнеет
0
5
10
15
20
25
30
35
JRE 1.1 JRE 1.2 JRE 1.3 JRE 1.4.0
JRE 1.4.2
JRE 5.0 JRE 6 JRE 7 JRE 7 U 6
JRE 8
JRE installer size on Windows x86, MB
Распространение Java приложений
• Добавить JRE в системные требования
• Загружать JRE перед установкой – Java-‐aware инсталляторы
• Java Web Start
• Включить JRE в инсталляцию (private JRE) – увеличивает размер на 15-‐30 MB
Размер имеет значение?
• Server Side (Java EE) – не проблема
• Desktop – зависит от приложения
• Mobile – 30 MB -‐ неприемлемо
Распространение Java приложений
Недостающая возможность: Private JRE …
Распространение Java приложений
Недостающая возможность: Private JRE маленького размера
Распространение Java приложений
Недостающая возможность: Private JRE маленького размера, позволит • меньше загружать из интернета • сократить занимаемое на диске место • улучшить User eXperience
Кто знает про Excelsior JET?
Кто знает про Excelsior JET?
Кто знает про Excelsior JET? Кто знает про Excelsior JET?
Кто знает про Excelsior JET? • Полная реализация Java SE
– c 2005 года cертифицирована как Java Compaxble
• AOT compiler + Java Runxme – смешанная компиляция: AOT + JIT – поддержка нестандартных загрузчиков классов в AOT режиме (для Eclipse RCP, Tomcat)
• Toolkit
– Startup Opxmizer – Deployment
AOT + JIT
Small Private JRE
Small Private JRE
Наблюдение: приложение использует далеко не все, что есть в private JRE.
Small Private JRE
Наблюдение: приложение использует далеко не все, что есть в private JRE.
Решение: удалить ненужные классы!
Small Private JRE
Наблюдение: приложение использует далеко не все, что есть в private JRE.
Решение: удалить ненужные классы! Вопрос: а какие классы -‐ ненужные?
“Ненужные” классы
Класс не нужен,
если он не является нужным
Нужные классы
• java.lang.Object – нужен
Нужные классы
• java.lang.Object – нужен
• класс импортированный нужным, тоже нужен
Нужные классы
• java.lang.Object – нужен
• класс импортированный нужным, тоже нужен
• замыкание импорта Object содержит...
Нужные классы
• java.lang.Object – нужен
• класс импортированный нужным, тоже нужен
• замыкание импорта Object содержит 3541 класс (для Java 8u20)
Нужные классы
• Замыкание java.lang.* + JVM specific: 3948 классов
• java.lang, java.io, java.uxl, etc.:
4797 классов
Нужные классы
class ForName { public staxc void main(String args[]) { Class c = Class.forName(args[0]); … } } Какие классы нужны этой программе?
Нужные классы
• При доступе через JNI и/или Reflecxon, неясно: – нужны ли еще классы? – если да, то какие?
Нужные классы
Нужные методы
public staxc String foo(Object o) { return o.toString(); } Какие методы (каких классов) нужны?
Ранние попытки уменьшить JRE
• Excelsior – single executable – оптимизация в предположении “замкнутости мира”
• Sun Microsystems – Sun Java Kernel (Consumer JRE)
• Остальные реализации Java? – не важно для Java ME, Java EE
Sun Java Kernel
Sun Java Kernel (2008)
Идея: установить минимум и загружать по мере необходимости, пока не получится полное JRE
Ожидаемый результат: быстрый старт приложения на машине, где нет Java
Sun Java Kernel
Реальность: 1. Выкачивается инсталлятор в 900KB
Sun Java Kernel
Реальность: 2. Загруженный инсталлятор, выкачивает
другой инсталлятор в 12MB!
Sun Java Kernel
Реальность: 3. Затем Java Kernel загружает сразу еще 5MB
(13MB + 5MB > 16MB -‐ обычное JRE 6)
Sun Java Kernel
Реальность: 4. И продолжает что-‐то качать …
Single Executable
Проблемы
1. “Клубки" импорта
2. Виртуальные вызовы
3. Мета-‐доступ
Наблюдения
1. Не все методы “нужного” класса исполняются
2. Instance-‐методы не могут исполняться, если не создан экземпляр класса (или его наследника)
– new T()
Rapid Type Analysis*
• Поиск достижимых методов – Начиная с точек входа, строим граф вызовов
– Анализируем код методов, накапливая
main C.foo()
B.bar()
LiveClasses VirtCallSites new T() c.bar() new B() b.foo()
* Идея принадлежит D.F. Bacon @ IBM
Rapid Type Analysis*
• при расширении LiveClasses – добавляем instance-‐методы в граф согласно VirtCallSites
• при расширении VirtCallSites – добавляем instance-‐методы в граф согласно LiveClasses
• достигаем неподвижной точки
Rapid Type Analysis*
• Эффективен – для «прореживания» библиотек
• Масштабируем – линейная сложность от числа операторов – существует реализация, обрабатывающая более 40,000 классов за 2 минуты
Нужные классы
Класс нужен, если он содержит
достижимые методы (по результатам RTA)
Глобальный анализатор
Application
Java SE API
Entry points - used - not used
Reflecxon & JNI?
Reflecxon & JNI?
• Пробный запуск (off-‐line profiling)
• Дополняет множества – точек входа – LiveClasses – VirtCallSites
Результаты
• Размер исполняемого файла без зависимостей: – Hello World ~800 KB – SWT Example ~1.4 MB
• При агрессивном удалении «ненужных» методов и их метаинформации
JetPerfect (2001)
Не такой уж perfect: – не соответствует Java SE спецификации – труден в использовании – приложения «не всегда работают» – возникающие (у конечного
пользователя) ошибки не диагностируемы
Java Runxme Slim-‐Down
Java Runxme Slim-‐Down (2007)
• Глобально оптимизированный исполняемый файл – «нужные» классы приложения и Java платформы оптимизируются совместно
• Оставшиеся классы – не удаляются – остается возможность загружать их через JIT
Java Runxme Slim-‐Down
• Java SE API делится на компоненты: – Kernel, XML, SQL, CORBA, AWT/Java2D, Swing, etc.
• анализатор определяет какие компоненты “нужны” – содержат достижимые методы
Глобальный анализатор
Application
Java SE API
Entry points - used - not used - component’s boundary
Java Runxme Slim-‐Down • Пользователю предоставляются:
– результаты анализа c возможностью исключить неиспользуемые компоненты
Java Runxme Slim-‐Down
• Исключенные компоненты: – помещаются на веб-‐сервер (доступны приложению)
– загружаются VM по требованию
• Соответствует Java SE спецификации!
Результаты
On GUI toolkits
• Экономия в размере незначительна, если используется Java2D, AWT/Swing
• Что делать?
On GUI toolkits
• Экономия в размере незначительна, если используется Java2D, AWT/Swing
• Что делать?
• Java Core + alternaxve GUI toolkit
Java Core + alternaxve GUI
Java Core + alternaxve GUI
Фрагментация Java
Java Core + alternaxve GUI
• SWT/JFace • eSWT • Java OpenGL • JavaFX
– уже входит в платформу!
JavaFX naxve Packager
Java Runxme Slim-‐Down
Ensemble Demo 34 MB 19 MB
BrickBreaker 30 MB 13 MB
Замечание: размеры дистрибутивов для Windows для Java 7, JavaFX зависел от AWT в Java 7
JavaFX Packager vs. Runxme Slim-‐Down
Java Runxme Slim-‐Down: уроки
• Компонентная модель JRE для уменьшения приватного Java Runxme – жизнеспособна – работает
• Проверено временем
Проект Jigsaw
Проект Jigsaw
• Java Module System h.p://openjdk.java.net/projects/jigsaw
• Модуляризация JRE – разбиение на компоненты – устранение лишних зависимостей – перевод на Module System
Прототип Java Module System • Доступен по h.p://jdk8.java.net/jigsaw/ • module-info.java
– описывает зависимости модуля (JLS, JVM)
• .jmod -‐ бинарный формат модуля • jpkg -‐ инструмент для упаковки модуля
– использует pack200, 7z, bzip • javac, jmod – статическое управление зависимостями
• java –m ... -‐ модульный режим запуска
Jigsaw: модуляризация JRE
• Планы: J Ä Java8 Ä
• Почему так долго? -‐ объективные причины
Jigsaw: трудности перевода
Jigsaw: трудности перевода
• Многие зависимости убраны, но многие еще осталось – процесс оказался очень трудоёмкий
• Проблемы с обратной совместимостью
– getClassLoader() == null – Class.forName() и правила видимости – classloader delegaxon
Jigsaw: проблемы прототипа
• Определены новые требования – обратная совместимость – «cвященная корова»
• Платформенные модули отличаются от пользовательских – нельзя подключать два платформенных модуля с одной функциональностью разных версий
– для пользовательских модулей -‐ можно
Jigsaw: текущий статус
• Не будет клона Maven, Ivy, Gradle • Поддержка нативных пакетных мэнеджеров
– Java модуль можно поставить через rpm, yum, etc.
– без поддержки Mac, Windows – для Mac, Windows будет инструмент паковки в нативный инсталлятор
• AOT компиляция Java модулей – если будет найден proof of concept
Jigsaw: текущий статус
JEP-‐161 (Compact Profiles) • Замена Java ME CDC • 3 профиля:
Compact1 Compact2 Compact3
java.lang java.rmi java.lang.instrument
java.io java.sql java.lang.management
java.math javax.transacxon javax.management
java.nio javax.xml javax.naming
java.uxl org.w3c.dom javax.script
java.net org.xml.sax javax.security
java.security javax.sql
javax.crypto javax.xml.crypto
java.text org.ie¯.jgss
Compact Profiles: инструменты • jdeps – инструмент статического анализа зависимостей приложения
• javac –profile – предупреждает о зависимостях вне указанного профиля
• jrecreate – создает нужный компактный профиль – Есть только в Java SE Embedded!
Compact Profiles: размеры • Compact1: 11MB
• Compact2: 15MB
• Compact3: 21MB
• Full JRE: 49MB Замечание: размеры на диске (ROM)
JEP-‐178 (Staxcally-‐Linked JNI libraries)
• Распространение без динамических библиотек – реализация naxve-‐методов линкуется к JVM – единый исполняемый файл
• Преодоление существующих барьеров – требования Apple AppStore
Заключение
• Компонентная модель JRE – жизнеспособна
• Перевод JRE на модульную систему – статический импорт (без лишних зависимостей) – требует времени
• Путь Java to Mobile – модульность: Java core + JavaFX – AOT компиляция + JEP-‐178