Java худеет.
Спроси меня как.
Виталий МихеевНикита Липский (twitter: @pjBooms)
Excelsior LLC
Java полнеет
0
5
10
15
20
25
30
35
40
45
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 size, MB
Распространение Java приложений
• Добавить JRE в системные требования
• Загружать JRE перед установкой – Java-aware инсталляторы
• Java Web Start
• Включить JRE в инсталляцию (private JRE) – увеличивает размер на 15-40 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?Кто знает про Excelsior JET?
Кто знает про Excelsior JET?
• Полная реализация Java SE– c 2005 года cертифицирована как Java Compatible
• AOT compiler + Java Runtime– смешанная компиляция: AOT + JIT– поддержка нестандартных загрузчиков классов в
AOT режиме (для Eclipse RCP, Tomcat)
• Toolkit– Startup Optimizer– 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 содержит2775 классов (для Java 7u10)
Нужные классы
• Замыкание java.lang.* + JVM specific:
3380 классов
• java.lang,java.io,java.util:
3742 классов
Нужные классы
class ForName {
public static void main(String args[]) {
Class c = Class.forName(args[0]);
…
}
}
Какие классы нужны этой программе?
Нужные классы
• При доступе через JNI и/илиReflection, неясно:
– нужны ли еще классы?
– если да, то какие?
Нужные классы
Нужные методы
public static 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*
• Поиск достижимых методов– Начиная с точек входа, строим граф вызовов
– Анализируем код методов, накапливая
mainC.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
Reflection & JNI?
Reflection & JNI?
• Пробный запуск (off-line profiling)
• Дополняет множества
– точек входа
– LiveClasses
– VirtCallSites
Результаты
• Размер исполняемого файла без зависимостей:
– Hello World ~800 KB
– SWT Example ~1.4 MB
• При агрессивном удалении «ненужных» методов и их метаинформации
JetPerfect (2001)
Не такой уж perfect:
– не соответствует Java SE спецификации
– труден в использовании
– приложения «не всегда работают»
– возникающие (у конечного пользователя) ошибки не диагностируемы
Java Runtime Slim-Down
Java Runtime Slim-Down (2007)
• Глобально оптимизированный исполняемый файл – «нужные» классы приложения и Java
платформы оптимизируются совместно
• Оставшиеся классы– не удаляются
– остается возможность загружать их через JIT
Java Runtime 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 Runtime Slim-Down• Пользователю предоставляются:
– результаты анализа c возможностью исключить неиспользуемые компоненты
Java Runtime Slim-Down
• Исключенные компоненты:– помещаются на веб-сервер (доступны
приложению)
– загружаются VM по требованию
• Соответствует Java SE спецификации!
On GUI toolkits
• Экономия в размере незначительна, если используется Java2D, AWT/Swing
• Что делать?
On GUI toolkits
• Экономия в размере незначительна, если используется Java2D, AWT/Swing
• Что делать?
• Java Core + alternative GUI toolkit
Java Core + alternative GUI
Java Core + alternative GUI
Фрагментация Java
Java Core + alternative GUI
• SWT/JFace
• eSWT
• Java OpenGL
• JavaFX– уже входит в платформу!
JavaFX native Packager
Java Runtime Slim-Down
Ensemble Demo 34 MB 19 MB
BrickBreaker 30 MB 13 MB
Замечание: JavaFX завиcит от AWT на момент Java 7u17
JavaFX Packager vs. Runtime Slim-Down
Проект Jigsaw
Проект Jigsaw
• Java Module Systemhttp://openjdk.java.net/projects/jigsaw/doc/quickstart.htmlhttp://jdk8.java.net/jigsaw/
• Модуляризация JRE– разбиение на компоненты
– устранение лишних зависимостей
– перевод на Module System
Jigsaw: Java Module System
• module-info.java
– описывает зависимости модуля (JLS, JVM)
• .jmod - бинарный формат модуля
• jpkg - инструмент для упаковки модуля
– использует pack200, 7z, bzip
• javac, jmod – статическое управление зависимостями
• java –m ... - модульный режим запуска
Jigsaw: модуляризация JRE
• Планы:
Java7 Java8
Java9
• Почему так долго?
- объективные причины
Jigsaw: трудности перевода
Jigsaw: трудности перевода
• Многие зависимости убраны
– еще много осталось
• Борьба за обратную совместимость– getClassLoader() == null
– Class.forName() и правила видимости
– classloader delegation
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.transaction javax.management
java.nio javax.xml javax.naming
java.util org.w3c.dom javax.script
java.net org.xml.sax javax.security
java.security javax.sql
javax.crypto javax.xml.crypto
java.text org.ietf.jgss
JEP-178 (Statically-Linked JNI libraries)
• Распространение без динамических библиотек– реализация native-методов линкуется к JVM
– единый исполняемый файл
• Преодоление существующих барьеров– требования Apple AppStore
Заключение
• Компонентная модель JRE– жизнеспособна
• Перевод JRE на модульную систему– статический импорт (без лишних зависимостей)
– требует времени
• Путь Java to Mobile– модульность: Java core + JavaFX
– AOT компиляция + JEP-178