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*
• Поиск достижимых методов
– Начиная с точек входа, строим граф вызовов
– Анализируем код методов, накапливая
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
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 System
http://openjdk.java.net/projects/jigsaw/doc/quickstart.html
http://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
Вопросы и ответы
Никита Липский
twitter: @pjBooms
email: nlipsky@excelsior-usa.com

Java худеет. Спроси меня как.

  • 1.
    Java худеет. Спроси менякак. Виталий Михеев Никита Липский (twitter: @pjBooms) Excelsior LLC
  • 2.
    Java полнеет 0 5 10 15 20 25 30 35 40 45 JRE 1.1JRE 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
  • 3.
    Распространение Java приложений •Добавить JRE в системные требования • Загружать JRE перед установкой – Java-aware инсталляторы • Java Web Start • Включить JRE в инсталляцию (private JRE) – увеличивает размер на 15-40 MB
  • 4.
    Размер имеет значение? •Server Side (Java EE) –не проблема • Desktop –зависит от приложения • Mobile –30 MB - неприемлемо
  • 5.
  • 6.
    Распространение Java приложений Недостающаявозможность: Private JRE маленького размера
  • 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
  • 11.
  • 12.
  • 13.
    Small Private JRE Наблюдение:приложение использует далеко не все, что есть в private JRE.
  • 14.
    Small Private JRE Наблюдение:приложение использует далеко не все, что есть в private JRE. Решение: удалить ненужные классы!
  • 15.
    Small Private JRE Наблюдение:приложение использует далеко не все, что есть в private JRE. Решение: удалить ненужные классы! Вопрос: а какие классы - ненужные?
  • 16.
    “Ненужные” классы Класс ненужен, если он не является нужным
  • 17.
  • 18.
    • java.lang.Object –нужен Нужные классы
  • 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 { publicstatic void main(String args[]) { Class c = Class.forName(args[0]); … } } Какие классы нужны этой программе? Нужные классы
  • 24.
    • При доступечерез JNI и/или Reflection, неясно: – нужны ли еще классы? – если да, то какие? Нужные классы
  • 25.
    Нужные методы public staticString foo(Object o) { return o.toString(); } Какие методы (каких классов) нужны?
  • 26.
    Ранние попытки уменьшитьJRE • Excelsior – single executable – оптимизация в предположении “замкнутости мира” • Sun Microsystems – Sun Java Kernel (Consumer JRE) • Остальные реализации Java? – не важно для Java ME, Java EE
  • 27.
  • 28.
    Sun Java Kernel(2008) Идея: установить минимум и загружать по мере необходимости, пока не получится полное JRE Ожидаемый результат: быстрый старт приложения на машине, где нет Java
  • 29.
    Sun Java Kernel Реальность: 1.Выкачивается инсталлятор в 900KB
  • 30.
    Sun Java Kernel Реальность: 2.Загруженный инсталлятор, выкачивает другой инсталлятор в 12MB!
  • 31.
    Sun Java Kernel Реальность: 3.Затем Java Kernel загружает сразу еще 5MB (13MB + 5MB > 16MB - обычное JRE 6)
  • 32.
    Sun Java Kernel Реальность: 4.И продолжает что-то качать …
  • 33.
  • 34.
    Проблемы 1. “Клубки" импорта 2.Виртуальные вызовы 3. Мета-доступ
  • 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 минуты
  • 39.
    Нужные классы Класс нужен,если он содержит достижимые методы (по результатам RTA)
  • 40.
  • 41.
  • 42.
    Reflection & JNI? •Пробный запуск (off-line profiling) • Дополняет множества – точек входа – LiveClasses – VirtCallSites
  • 43.
    Результаты • Размер исполняемогофайла без зависимостей: – Hello World ~800 KB – SWT Example ~1.4 MB • При агрессивном удалении «ненужных» методов и их метаинформации
  • 44.
    JetPerfect (2001) Не такойуж perfect: – не соответствует Java SE спецификации – труден в использовании – приложения «не всегда работают» – возникающие (у конечного пользователя) ошибки не диагностируемы
  • 45.
  • 46.
    Java Runtime Slim-Down(2007) • Глобально оптимизированный исполняемый файл – «нужные» классы приложения и Java платформы оптимизируются совместно • Оставшиеся классы – не удаляются – остается возможность загружать их через JIT
  • 47.
    Java Runtime Slim-Down •Java SE API делится на компоненты: – Kernel, XML, SQL, CORBA, AWT/Java2D, Swing, etc. • анализатор определяет какие компоненты “нужны” – содержат достижимые методы
  • 48.
    Глобальный анализатор Application Java SEAPI Entry points - used - not used - component’s boundary
  • 49.
    Java Runtime Slim-Down •Пользователю предоставляются: – результаты анализа c возможностью исключить неиспользуемые компоненты
  • 50.
    Java Runtime Slim-Down •Исключенные компоненты: – помещаются на веб-сервер (доступны приложению) – загружаются VM по требованию • Соответствует Java SE спецификации!
  • 51.
  • 52.
    On GUI toolkits •Экономия в размере незначительна, если используется Java2D, AWT/Swing • Что делать?
  • 53.
    On GUI toolkits •Экономия в размере незначительна, если используется Java2D, AWT/Swing • Что делать? • Java Core + alternative GUI toolkit
  • 54.
    Java Core +alternative GUI
  • 55.
    Java Core +alternative GUI Фрагментация Java
  • 56.
    Java Core +alternative GUI • SWT/JFace • eSWT • Java OpenGL • JavaFX – уже входит в платформу!
  • 57.
    JavaFX native Packager Java Runtime Slim-Down EnsembleDemo 34 MB 19 MB BrickBreaker 30 MB 13 MB Замечание: JavaFX завиcит от AWT на момент Java 7u17  JavaFX Packager vs. Runtime Slim-Down
  • 58.
  • 59.
    Проект Jigsaw • JavaModule System http://openjdk.java.net/projects/jigsaw/doc/quickstart.html http://jdk8.java.net/jigsaw/ • Модуляризация JRE – разбиение на компоненты – устранение лишних зависимостей – перевод на Module System
  • 60.
    Jigsaw: Java ModuleSystem • module-info.java – описывает зависимости модуля (JLS, JVM) • .jmod - бинарный формат модуля • jpkg - инструмент для упаковки модуля – использует pack200, 7z, bzip • javac, jmod – статическое управление зависимостями • java –m ... - модульный режим запуска
  • 61.
    Jigsaw: модуляризация JRE •Планы: Java7  Java8  Java9 • Почему так долго? - объективные причины
  • 62.
  • 63.
  • 64.
    • Многие зависимостиубраны –еще много осталось • Борьба за обратную совместимость – getClassLoader() == null – Class.forName() и правила видимости –classloader delegation Jigsaw: текущий статус
  • 65.
    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
  • 66.
    JEP-178 (Statically-Linked JNIlibraries) • Распространение без динамических библиотек – реализация native-методов линкуется к JVM – единый исполняемый файл • Преодоление существующих барьеров – требования Apple AppStore
  • 67.
    Заключение • Компонентная модельJRE – жизнеспособна • Перевод JRE на модульную систему – статический импорт (без лишних зависимостей) – требует времени • Путь Java to Mobile – модульность: Java core + JavaFX – AOT компиляция + JEP-178
  • 68.
    Вопросы и ответы НикитаЛипский twitter: @pjBooms email: nlipsky@excelsior-usa.com