Java худеет. Спроси меня как.
-
Upload
nikita-lipsky -
Category
Documents
-
view
1.763 -
download
0
description
Transcript of Java худеет. Спроси меня как.
![Page 1: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/1.jpg)
Java худеет.
Спроси меня как.
Виталий МихеевНикита Липский (twitter: @pjBooms)
Excelsior LLC
![Page 2: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/2.jpg)
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
![Page 3: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/3.jpg)
Распространение Java приложений
• Добавить JRE в системные требования
• Загружать JRE перед установкой – Java-aware инсталляторы
• Java Web Start
• Включить JRE в инсталляцию (private JRE) – увеличивает размер на 15-40 MB
![Page 4: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/4.jpg)
Размер имеет значение?
• Server Side (Java EE)
– не проблема
• Desktop
– зависит от приложения
• Mobile
– 30 MB - неприемлемо
![Page 5: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/5.jpg)
Распространение Java приложений
Недостающая возможность:
Private JRE …
![Page 6: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/6.jpg)
Распространение Java приложений
Недостающая возможность:
Private JRE маленького размера
![Page 7: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/7.jpg)
Распространение Java приложений
Недостающая возможность:
Private JRE маленького размера, позволит
• меньше загружать из интернета
• сократить занимаемое на диске место
• улучшить User eXperience
![Page 8: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/8.jpg)
Кто знает про Excelsior JET?
Кто знает про Excelsior JET?Кто знает про Excelsior JET?
![Page 9: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/9.jpg)
Кто знает про Excelsior JET?
Кто знает про Excelsior JET?Кто знает про Excelsior JET?
![Page 10: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/10.jpg)
Кто знает про Excelsior JET?
• Полная реализация Java SE– c 2005 года cертифицирована как Java Compatible
• AOT compiler + Java Runtime– смешанная компиляция: AOT + JIT– поддержка нестандартных загрузчиков классов в
AOT режиме (для Eclipse RCP, Tomcat)
• Toolkit– Startup Optimizer– Deployment
![Page 11: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/11.jpg)
AOT + JIT
![Page 12: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/12.jpg)
Small Private JRE
![Page 13: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/13.jpg)
Small Private JRE
Наблюдение: приложение использует далеко не все, что есть в private JRE.
![Page 14: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/14.jpg)
Small Private JRE
Наблюдение: приложение использует далеко не все, что есть в private JRE.
Решение: удалить ненужные классы!
![Page 15: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/15.jpg)
Small Private JRE
Наблюдение: приложение использует далеко не все, что есть в private JRE.
Решение: удалить ненужные классы!
Вопрос: а какие классы - ненужные?
![Page 16: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/16.jpg)
“Ненужные” классы
Класс не нужен,
если он не является
нужным
![Page 17: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/17.jpg)
Нужные классы
![Page 18: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/18.jpg)
• java.lang.Object – нужен
Нужные классы
![Page 19: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/19.jpg)
• java.lang.Object – нужен
• класс импортированный нужным, тоже нужен
Нужные классы
![Page 20: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/20.jpg)
• java.lang.Object – нужен
• класс импортированный нужным, тоже нужен
• замыкание импорта Object содержит...
Нужные классы
![Page 21: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/21.jpg)
• java.lang.Object – нужен
• класс импортированный нужным, тоже нужен
• замыкание импорта Object содержит2775 классов (для Java 7u10)
Нужные классы
![Page 22: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/22.jpg)
• Замыкание java.lang.* + JVM specific:
3380 классов
• java.lang,java.io,java.util:
3742 классов
Нужные классы
![Page 23: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/23.jpg)
class ForName {
public static void main(String args[]) {
Class c = Class.forName(args[0]);
…
}
}
Какие классы нужны этой программе?
Нужные классы
![Page 24: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/24.jpg)
• При доступе через JNI и/илиReflection, неясно:
– нужны ли еще классы?
– если да, то какие?
Нужные классы
![Page 25: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/25.jpg)
Нужные методы
public static String foo(Object o) {
return o.toString();
}
Какие методы (каких классов) нужны?
![Page 26: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/26.jpg)
Ранние попытки уменьшить JRE
• Excelsior– single executable
– оптимизация в предположении “замкнутости мира”
• Sun Microsystems – Sun Java Kernel (Consumer JRE)
• Остальные реализации Java?– не важно для Java ME, Java EE
![Page 27: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/27.jpg)
Sun Java Kernel
![Page 28: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/28.jpg)
Sun Java Kernel (2008)
Идея: установить минимум и загружать по мере необходимости, пока не получится полное JRE
Ожидаемый результат: быстрый старт приложения на машине, где нет Java
![Page 29: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/29.jpg)
Sun Java Kernel
Реальность:
1. Выкачивается инсталлятор в 900KB
![Page 30: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/30.jpg)
Sun Java Kernel
Реальность:
2. Загруженный инсталлятор, выкачивает другой инсталлятор в 12MB!
![Page 31: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/31.jpg)
Sun Java Kernel
Реальность:
3. Затем Java Kernel загружает сразу еще 5MB(13MB + 5MB > 16MB - обычное JRE 6)
![Page 32: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/32.jpg)
Sun Java Kernel
Реальность:
4. И продолжает что-то качать …
![Page 33: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/33.jpg)
Single Executable
![Page 34: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/34.jpg)
Проблемы
1. “Клубки" импорта
2. Виртуальные вызовы
3. Мета-доступ
![Page 35: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/35.jpg)
Наблюдения
1. Не все методы “нужного” класса исполняются
2. Instance-методы не могут исполняться, если не создан экземпляр класса (или его наследника)
– new T()
![Page 36: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/36.jpg)
Rapid Type Analysis*
• Поиск достижимых методов– Начиная с точек входа, строим граф вызовов
– Анализируем код методов, накапливая
mainC.foo()
B.bar()
LiveClasses VirtCallSites
new T() c.bar()
new B() b.foo()
* Идея принадлежит D.F. Bacon @ IBM
![Page 37: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/37.jpg)
Rapid Type Analysis*
• при расширении LiveClasses
– добавляем instance-методы в граф согласно VirtCallSites
• при расширении VirtCallSites
– добавляем instance-методы в граф согласно LiveClasses
• достигаем неподвижной точки
![Page 38: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/38.jpg)
Rapid Type Analysis*
• Эффективен
– для «прореживания» библиотек
• Масштабируем
– линейная сложность от числа операторов
– существует реализация, обрабатывающая более 40,000 классов за 2 минуты
![Page 39: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/39.jpg)
Нужные классы
Класс нужен, если он содержит достижимые методы
(по результатам RTA)
![Page 40: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/40.jpg)
Глобальный анализатор
Application
Java SE API
Entry points- used
- not used
![Page 41: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/41.jpg)
Reflection & JNI?
![Page 42: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/42.jpg)
Reflection & JNI?
• Пробный запуск (off-line profiling)
• Дополняет множества
– точек входа
– LiveClasses
– VirtCallSites
![Page 43: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/43.jpg)
Результаты
• Размер исполняемого файла без зависимостей:
– Hello World ~800 KB
– SWT Example ~1.4 MB
• При агрессивном удалении «ненужных» методов и их метаинформации
![Page 44: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/44.jpg)
JetPerfect (2001)
Не такой уж perfect:
– не соответствует Java SE спецификации
– труден в использовании
– приложения «не всегда работают»
– возникающие (у конечного пользователя) ошибки не диагностируемы
![Page 45: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/45.jpg)
Java Runtime Slim-Down
![Page 46: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/46.jpg)
Java Runtime Slim-Down (2007)
• Глобально оптимизированный исполняемый файл – «нужные» классы приложения и Java
платформы оптимизируются совместно
• Оставшиеся классы– не удаляются
– остается возможность загружать их через JIT
![Page 47: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/47.jpg)
Java Runtime Slim-Down
• Java SE API делится на компоненты:– Kernel, XML, SQL, CORBA, AWT/Java2D, Swing, etc.
• анализатор определяет какие компоненты “нужны”– содержат достижимые методы
![Page 48: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/48.jpg)
Глобальный анализатор
Application
Java SE API
Entry points- used
- not used
- component’s boundary
![Page 49: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/49.jpg)
Java Runtime Slim-Down• Пользователю предоставляются:
– результаты анализа c возможностью исключить неиспользуемые компоненты
![Page 50: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/50.jpg)
Java Runtime Slim-Down
• Исключенные компоненты:– помещаются на веб-сервер (доступны
приложению)
– загружаются VM по требованию
• Соответствует Java SE спецификации!
![Page 52: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/52.jpg)
On GUI toolkits
• Экономия в размере незначительна, если используется Java2D, AWT/Swing
• Что делать?
![Page 53: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/53.jpg)
On GUI toolkits
• Экономия в размере незначительна, если используется Java2D, AWT/Swing
• Что делать?
• Java Core + alternative GUI toolkit
![Page 54: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/54.jpg)
Java Core + alternative GUI
![Page 55: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/55.jpg)
Java Core + alternative GUI
Фрагментация Java
![Page 56: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/56.jpg)
Java Core + alternative GUI
• SWT/JFace
• eSWT
• Java OpenGL
• JavaFX– уже входит в платформу!
![Page 57: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/57.jpg)
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
![Page 58: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/58.jpg)
Проект Jigsaw
![Page 59: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/59.jpg)
Проект Jigsaw
• Java Module Systemhttp://openjdk.java.net/projects/jigsaw/doc/quickstart.htmlhttp://jdk8.java.net/jigsaw/
• Модуляризация JRE– разбиение на компоненты
– устранение лишних зависимостей
– перевод на Module System
![Page 60: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/60.jpg)
Jigsaw: Java Module System
• module-info.java
– описывает зависимости модуля (JLS, JVM)
• .jmod - бинарный формат модуля
• jpkg - инструмент для упаковки модуля
– использует pack200, 7z, bzip
• javac, jmod – статическое управление зависимостями
• java –m ... - модульный режим запуска
![Page 61: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/61.jpg)
Jigsaw: модуляризация JRE
• Планы:
Java7 Java8
Java9
• Почему так долго?
- объективные причины
![Page 62: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/62.jpg)
Jigsaw: трудности перевода
![Page 63: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/63.jpg)
Jigsaw: трудности перевода
![Page 64: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/64.jpg)
• Многие зависимости убраны
– еще много осталось
• Борьба за обратную совместимость– getClassLoader() == null
– Class.forName() и правила видимости
– classloader delegation
Jigsaw: текущий статус
![Page 65: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/65.jpg)
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
![Page 66: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/66.jpg)
JEP-178 (Statically-Linked JNI libraries)
• Распространение без динамических библиотек– реализация native-методов линкуется к JVM
– единый исполняемый файл
• Преодоление существующих барьеров– требования Apple AppStore
![Page 67: Java худеет. Спроси меня как.](https://reader033.fdocument.pub/reader033/viewer/2022052523/556152bdd8b42aa20d8b502f/html5/thumbnails/67.jpg)
Заключение
• Компонентная модель JRE– жизнеспособна
• Перевод JRE на модульную систему– статический импорт (без лишних зависимостей)
– требует времени
• Путь Java to Mobile– модульность: Java core + JavaFX
– AOT компиляция + JEP-178