3. Распространение Java приложений
• Добавить JRE в системные требования
• Загружать JRE перед установкой
– Java-aware инсталляторы
• Java Web Start
• Включить JRE в инсталляцию (private JRE)
– увеличивает размер на 15-40 MB
4. Размер имеет значение?
• Server Side (Java EE)
–не проблема
• Desktop
–зависит от приложения
• Mobile
–30 MB - неприемлемо
7. Распространение Java приложений
Недостающая возможность:
Private JRE маленького размера, позволит
• меньше загружать из интернета
• сократить занимаемое на диске место
• улучшить User eXperience
8. Кто знает про Excelsior JET?
Кто знает про Excelsior JET?Кто знает про Excelsior JET?
9. Кто знает про Excelsior JET?
Кто знает про Excelsior JET?Кто знает про Excelsior JET?
10. Кто знает про Excelsior JET?
• Полная реализация Java SE
– c 2005 года cертифицирована как Java Compatible
• AOT compiler + Java Runtime
– смешанная компиляция: AOT + JIT
– поддержка нестандартных загрузчиков классов в
AOT режиме (для Eclipse RCP, Tomcat)
• Toolkit
– Startup Optimizer
– Deployment
14. Small Private JRE
Наблюдение: приложение использует
далеко не все, что есть в private JRE.
Решение: удалить ненужные классы!
15. Small Private JRE
Наблюдение: приложение использует
далеко не все, что есть в private JRE.
Решение: удалить ненужные классы!
Вопрос: а какие классы - ненужные?
19. • java.lang.Object – нужен
• класс импортированный нужным, тоже
нужен
Нужные классы
20. • java.lang.Object – нужен
• класс импортированный нужным, тоже
нужен
• замыкание импорта Object содержит...
Нужные классы
21. • java.lang.Object – нужен
• класс импортированный нужным, тоже
нужен
• замыкание импорта Object содержит
2775 классов (для Java 7u10)
Нужные классы
22. • Замыкание java.lang.* + JVM specific:
3380 классов
• java.lang,
java.io,
java.util:
3742 классов
Нужные классы
23. class ForName {
public static void main(String args[]) {
Class c = Class.forName(args[0]);
…
}
}
Какие классы нужны этой программе?
Нужные классы
24. • При доступе через JNI и/или
Reflection, неясно:
– нужны ли еще классы?
– если да, то какие?
Нужные классы
25. Нужные методы
public static String foo(Object o) {
return o.toString();
}
Какие методы (каких классов) нужны?
26. Ранние попытки уменьшить JRE
• Excelsior
– single executable
– оптимизация в предположении “замкнутости
мира”
• Sun Microsystems
– Sun Java Kernel (Consumer JRE)
• Остальные реализации Java?
– не важно для Java ME, Java EE
28. Sun Java Kernel (2008)
Идея: установить минимум и загружать по
мере необходимости, пока не получится
полное JRE
Ожидаемый результат: быстрый старт
приложения на машине, где нет Java
35. Наблюдения
1. Не все методы “нужного” класса
исполняются
2. Instance-методы не могут
исполняться, если не создан экземпляр
класса (или его наследника)
– new T()
36. Rapid Type Analysis*
• Поиск достижимых методов
– Начиная с точек входа, строим граф вызовов
– Анализируем код методов, накапливая
main
C.foo()
B.bar()
LiveClasses VirtCallSites
new T() c.bar()
new B() b.foo()
* Идея принадлежит D.F. Bacon @ IBM
37. Rapid Type Analysis*
• при расширении LiveClasses
– добавляем instance-методы в граф
согласно VirtCallSites
• при расширении VirtCallSites
– добавляем instance-методы в граф
согласно LiveClasses
• достигаем неподвижной точки
38. Rapid Type Analysis*
• Эффективен
– для «прореживания» библиотек
• Масштабируем
–линейная сложность от числа операторов
–существует реализация, обрабатывающая
более 40,000 классов за 2 минуты
43. Результаты
• Размер исполняемого файла без
зависимостей:
– Hello World ~800 KB
– SWT Example ~1.4 MB
• При агрессивном удалении «ненужных»
методов и их метаинформации
44. JetPerfect (2001)
Не такой уж perfect:
– не соответствует Java SE спецификации
– труден в использовании
– приложения «не всегда работают»
– возникающие (у конечного
пользователя) ошибки не
диагностируемы
46. Java Runtime Slim-Down (2007)
• Глобально оптимизированный
исполняемый файл
– «нужные» классы приложения и Java
платформы оптимизируются совместно
• Оставшиеся классы
– не удаляются
– остается возможность загружать их через JIT
47. Java Runtime Slim-Down
• Java SE API делится на компоненты:
– Kernel, XML, SQL, CORBA, AWT/Java2D, Swing, etc.
• анализатор определяет какие
компоненты “нужны”
– содержат достижимые методы
49. Java Runtime Slim-Down
• Пользователю предоставляются:
– результаты анализа c возможностью исключить
неиспользуемые компоненты
50. Java Runtime Slim-Down
• Исключенные компоненты:
– помещаются на веб-сервер (доступны
приложению)
– загружаются VM по требованию
• Соответствует Java SE спецификации!
59. Проект Jigsaw
• Java Module System
http://openjdk.java.net/projects/jigsaw/doc/quickstart.html
http://jdk8.java.net/jigsaw/
• Модуляризация JRE
– разбиение на компоненты
– устранение лишних зависимостей
– перевод на Module System
60. Jigsaw: Java Module System
• module-info.java
– описывает зависимости модуля (JLS, JVM)
• .jmod - бинарный формат модуля
• jpkg - инструмент для упаковки модуля
– использует pack200, 7z, bzip
• javac, jmod – статическое управление
зависимостями
• java –m ... - модульный режим запуска
64. • Многие зависимости убраны
–еще много осталось
• Борьба за обратную совместимость
– getClassLoader() == null
– Class.forName() и правила видимости
–classloader delegation
Jigsaw: текущий статус
66. JEP-178 (Statically-Linked JNI libraries)
• Распространение без динамических
библиотек
– реализация native-методов линкуется к JVM
– единый исполняемый файл
• Преодоление существующих барьеров
– требования Apple AppStore
67. Заключение
• Компонентная модель JRE
– жизнеспособна
• Перевод JRE на модульную систему
– статический импорт (без лишних зависимостей)
– требует времени
• Путь Java to Mobile
– модульность: Java core + JavaFX
– AOT компиляция + JEP-178