Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Java 
худеет. 
Спроси 
меня 
как. 
Никита 
Липский 
twi.er: 
@pjBooms 
Excelsior 
LLC
Java 
полнеет 
35 
30 
25 
20 
15 
10 
5 
0 
JRE 
1.1 
JRE 
1.2 
JRE 
1.3 
JRE 
1.4.0 
JRE 
1.4.2 
JRE 
5.0 
JRE 
6 
JRE 
...
Распространение 
Java 
приложений 
• Добавить 
JRE 
в 
системные 
требования 
• Загружать 
JRE 
перед 
установкой 
– Java-...
Размер 
имеет 
значение? 
• Server 
Side 
(Java 
EE) 
– не 
проблема 
• Desktop 
– зависит 
от 
приложения 
• Mobile 
– 30...
Распространение 
Java 
приложений 
Недостающая 
возможность: 
Private 
JRE 
…
Распространение 
Java 
приложений 
Недостающая 
возможность: 
Private 
JRE 
маленького 
размера
Распространение 
Java 
приложений 
Недостающая 
возможность: 
Private 
JRE 
маленького 
размера, 
позволит 
• меньше 
загр...
Кто 
знает 
про 
Excelsior 
JET?
Кто 
знает 
про 
Excelsior 
JET? 
Кто ззннааеетт ппрроо Excelsior JET?
Кто 
знает 
про 
Excelsior 
JET? 
• Полная 
реализация 
Java 
SE 
– 
c 
2005 
года 
cертифицирована 
как 
Java 
Compaxble ...
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...
• Замыкание 
Нужные 
классы 
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 
Java 
Kernel
Sun 
Java 
Kernel 
(2008) 
Идея: 
установить 
минимум 
и 
загружать 
по 
мере 
необходимости, 
пока 
не 
получится 
полное...
Sun 
Java 
Kernel 
Реальность: 
1. Выкачивается 
инсталлятор 
в 
900KB
Sun 
Java 
Kernel 
Реальность: 
2. Загруженный 
инсталлятор, 
выкачивает 
другой 
инсталлятор 
в 
12MB!
Sun 
Java 
Kernel 
Реальность: 
3. Затем 
Java 
Kernel 
загружает 
сразу 
еще 
5MB 
(13MB 
+ 
5MB 
> 
16MB 
-­‐ 
обычное 
...
Sun 
Java 
Kernel 
Реальность: 
4. И 
продолжает 
что-­‐то 
качать 
…
Single 
Executable
Проблемы 
1. “Клубки" 
импорта 
2. Виртуальные 
вызовы 
3. Мета-­‐доступ
Наблюдения 
1. Не 
все 
методы 
“нужного” 
класса 
исполняются 
2. Instance-­‐методы 
не 
могут 
исполняться, 
если 
не 
с...
Rapid 
Type 
Analysis* 
• Поиск 
достижимых 
методов 
– Начиная 
с 
точек 
входа, 
строим 
граф 
вызовов 
– Анализируем 
к...
Rapid 
Type 
Analysis* 
• при 
расширении 
LiveClasses 
– 
добавляем 
instance-­‐методы 
в 
граф 
согласно 
VirtCallSites ...
Rapid 
Type 
Analysis* 
• Эффективен 
– 
для 
«прореживания» 
библиотек 
• Масштабируем 
– линейная 
сложность 
от 
числа ...
Нужные 
классы 
Класс 
нужен, 
если 
он 
содержит 
достижимые 
методы 
(по 
результатам 
RTA)
Глобальный 
анализатор 
Application 
Java SE API 
Entry points 
- used 
- not used
Reflecxon 
& 
JNI?
Reflecxon 
& 
JNI? 
• Пробный 
запуск 
(off-­‐line 
profiling) 
• Дополняет 
множества 
– точек 
входа 
– LiveClasses 
– V...
Результаты 
• Размер 
исполняемого 
файла 
без 
зависимостей: 
– Hello 
World 
~800 
KB 
– SWT 
Example 
~1.4 
MB 
• При 
...
JetPerfect 
(2001) 
Не 
такой 
уж 
perfect: 
– не 
соответствует 
Java 
SE 
спецификации 
– труден 
в 
использовании 
– пр...
Java 
Runxme 
Slim-­‐Down
Java 
Runxme 
Slim-­‐Down 
(2007) 
• Глобально 
оптимизированный 
исполняемый 
файл 
– «нужные» 
классы 
приложения 
и 
Ja...
Java 
Runxme 
Slim-­‐Down 
• Java 
SE 
API 
делится 
на 
компоненты: 
– Kernel, 
XML, 
SQL, 
CORBA, 
AWT/Java2D, 
Swing, 
...
Глобальный 
анализатор 
Application 
Java SE API 
Entry points 
- used 
- not used 
- component’s boundary
Java 
Runxme 
Slim-­‐Down 
• Пользователю 
предоставляются: 
– результаты 
анализа 
c 
возможностью 
исключить 
неиспользу...
Java 
Runxme 
Slim-­‐Down 
• Исключенные 
компоненты: 
– помещаются 
на 
веб-­‐сервер 
(доступны 
приложению) 
– загружают...
Результаты
On 
GUI 
toolkits 
• Экономия 
в 
размере 
незначительна, 
если 
используется 
Java2D, 
AWT/Swing 
• Что 
делать?
On 
GUI 
toolkits 
• Экономия 
в 
размере 
незначительна, 
если 
используется 
Java2D, 
AWT/Swing 
• Что 
делать? 
• Java ...
Java 
Core 
+ 
alternaxve 
GUI
Java 
Core 
+ 
alternaxve 
GUI 
Фрагментация 
Java
Java 
Core 
+ 
alternaxve 
GUI 
• SWT/JFace 
• eSWT 
• Java 
OpenGL 
• JavaFX 
– уже 
входит 
в 
платформу!
JavaFX 
Packager 
vs. 
Runxme 
Slim-­‐Down 
JavaFX 
naxve 
Packager 
Java 
Runxme 
Slim-­‐Down 
Ensemble 
Demo 
34 
MB 
19...
Java 
Runxme 
Slim-­‐Down: 
уроки 
• Компонентная 
модель 
JRE 
для 
уменьшения 
приватного 
Java 
Runxme 
– жизнеспособна...
Проект 
Jigsaw
Проект 
Jigsaw 
• Java 
Module 
System 
h.p://openjdk.java.net/projects/jigsaw 
• Модуляризация 
JRE 
– разбиение 
на 
ком...
Прототип 
Java 
Module 
System 
• Доступен 
по 
h.p://jdk8.java.net/jigsaw/ 
• module-info.java 
– описывает 
зависимости ...
Jigsaw: 
модуляризация 
JRE 
• Планы: 
J 
Ä 
Java8 
Ä 
• Почему 
так 
долго? 
-­‐ 
объективные 
причины
Jigsaw: 
трудности 
перевода
Jigsaw: 
трудности 
перевода
Jigsaw: 
проблемы 
прототипа 
• Многие 
зависимости 
убраны, 
но 
многие 
еще 
осталось 
– процесс 
оказался 
очень 
трудо...
Jigsaw: 
текущий 
статус 
• Определены 
новые 
требования 
– обратная 
совместимость 
– 
«cвященная 
корова» 
• Платформен...
• Не 
Jigsaw: 
текущий 
статус 
будет 
клона 
Maven, 
Ivy, 
Gradle 
• Поддержка 
нативных 
пакетных 
мэнеджеров 
– Java 
м...
JEP-­‐161 
(Compact 
Profiles) 
• Замена 
Java 
ME 
CDC 
• 3 
профиля: 
Compact1 
Compact2 
Compact3 
java.lang 
java.rmi ...
Compact 
Profiles: 
инструменты 
• jdeps 
– 
инструмент 
статического 
анализа 
зависимостей 
приложения 
• javac –profile...
Compact 
Profiles: 
размеры 
• Compact1: 
11MB 
• Compact2: 
15MB 
• Compact3: 
21MB 
• Full 
JRE: 
49MB 
Замечание: 
разм...
JEP-­‐178 
(Staxcally-­‐Linked 
JNI 
libraries) 
• Распространение 
без 
динамических 
библиотек 
– реализация 
naxve-­‐ме...
Заключение 
• Компонентная 
модель 
JRE 
– жизнеспособна 
• Перевод 
JRE 
на 
модульную 
систему 
– статический 
импорт 
(...
Вопросы и ответы 
Никита Липский, 
Excelsior 
nlipsky@excelsior-usa.com 
twitter: @pjBooms
Upcoming SlideShare
Loading in …5
×

Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения без зависимостей.

1,023 views

Published on

#JavaDayKiev presentation

Published in: Software
  • Be the first to comment

Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения без зависимостей.

  1. 1. Java худеет. Спроси меня как. Никита Липский twi.er: @pjBooms Excelsior LLC
  2. 2. Java полнеет 35 30 25 20 15 10 5 0 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 Window s x 8 6 , M B
  3. 3. Распространение Java приложений • Добавить JRE в системные требования • Загружать JRE перед установкой – Java-­‐aware инсталляторы • Java Web Start • Включить JRE в инсталляцию (private JRE) – увеличивает размер на 15-­‐30 MB
  4. 4. Размер имеет значение? • Server Side (Java EE) – не проблема • Desktop – зависит от приложения • Mobile – 30 MB -­‐ неприемлемо
  5. 5. Распространение Java приложений Недостающая возможность: Private JRE …
  6. 6. Распространение Java приложений Недостающая возможность: Private JRE маленького размера
  7. 7. Распространение Java приложений Недостающая возможность: Private JRE маленького размера, позволит • меньше загружать из интернета • сократить занимаемое на диске место • улучшить User eXperience
  8. 8. Кто знает про Excelsior JET?
  9. 9. Кто знает про Excelsior JET? Кто ззннааеетт ппрроо Excelsior JET?
  10. 10. Кто знает про Excelsior JET? • Полная реализация Java SE – c 2005 года cертифицирована как Java Compaxble • AOT compiler + Java Runxme – смешанная компиляция: AOT + JIT – поддержка нестандартных загрузчиков классов в AOT режиме (для Eclipse RCP, Tomcat) • Toolkit – Startup Opxmizer – Deployment
  11. 11. AOT + JIT
  12. 12. Small Private JRE
  13. 13. Small Private JRE Наблюдение: приложение использует далеко не все, что есть в private JRE.
  14. 14. Small Private JRE Наблюдение: приложение использует далеко не все, что есть в private JRE. Решение: удалить ненужные классы!
  15. 15. Small Private JRE Наблюдение: приложение использует далеко не все, что есть в private JRE. Решение: удалить ненужные классы! Вопрос: а какие классы -­‐ ненужные?
  16. 16. “Ненужные” классы Класс не нужен, если он не является нужным
  17. 17. Нужные классы
  18. 18. Нужные классы • java.lang.Object – нужен
  19. 19. • java.lang.Object – нужен • класс импортированный нужным, тоже нужен Нужные классы
  20. 20. Нужные классы • java.lang.Object – нужен • класс импортированный нужным, тоже нужен • замыкание импорта Object содержит...
  21. 21. Нужные классы • java.lang.Object – нужен • класс импортированный нужным, тоже нужен • замыкание импорта Object содержит 3541 класс (для Java 8u20)
  22. 22. • Замыкание Нужные классы java.lang.* + JVM specific: 3948 классов • java.lang, java.io, java.uxl, etc.: 4797 классов
  23. 23. Нужные классы class ForName { public staxc void main(String args[]) { Class c = Class.forName(args[0]); … } } Какие классы нужны этой программе?
  24. 24. • При Нужные классы доступе через JNI и/или Reflecxon, неясно: – нужны ли еще классы? – если да, то какие?
  25. 25. Нужные методы public staxc String foo(Object o) { return o.toString(); } Какие методы (каких классов) нужны?
  26. 26. Ранние попытки уменьшить JRE • Excelsior – single executable – оптимизация в предположении “замкнутости мира” • Sun Microsystems – Sun Java Kernel (Consumer JRE) • Остальные реализации Java? – не важно для Java ME, Java EE
  27. 27. Sun Java Kernel
  28. 28. Sun Java Kernel (2008) Идея: установить минимум и загружать по мере необходимости, пока не получится полное JRE Ожидаемый результат: быстрый старт приложения на машине, где нет Java
  29. 29. Sun Java Kernel Реальность: 1. Выкачивается инсталлятор в 900KB
  30. 30. Sun Java Kernel Реальность: 2. Загруженный инсталлятор, выкачивает другой инсталлятор в 12MB!
  31. 31. Sun Java Kernel Реальность: 3. Затем Java Kernel загружает сразу еще 5MB (13MB + 5MB > 16MB -­‐ обычное JRE 6)
  32. 32. Sun Java Kernel Реальность: 4. И продолжает что-­‐то качать …
  33. 33. Single Executable
  34. 34. Проблемы 1. “Клубки" импорта 2. Виртуальные вызовы 3. Мета-­‐доступ
  35. 35. Наблюдения 1. Не все методы “нужного” класса исполняются 2. Instance-­‐методы не могут исполняться, если не создан экземпляр класса (или его наследника) – new T()
  36. 36. Rapid Type Analysis* • Поиск достижимых методов – Начиная с точек входа, строим граф вызовов – Анализируем код методов, накапливая main C.foo() B.bar() LiveClasses VirtCallSites new T() c.bar() new B() b.foo() * Идея принадлежит D.F. Bacon @ IBM
  37. 37. Rapid Type Analysis* • при расширении LiveClasses – добавляем instance-­‐методы в граф согласно VirtCallSites • при расширении VirtCallSites – добавляем instance-­‐методы в граф согласно LiveClasses • достигаем неподвижной точки
  38. 38. Rapid Type Analysis* • Эффективен – для «прореживания» библиотек • Масштабируем – линейная сложность от числа операторов – существует реализация, обрабатывающая более 40,000 классов за 2 минуты
  39. 39. Нужные классы Класс нужен, если он содержит достижимые методы (по результатам RTA)
  40. 40. Глобальный анализатор Application Java SE API Entry points - used - not used
  41. 41. Reflecxon & JNI?
  42. 42. Reflecxon & JNI? • Пробный запуск (off-­‐line profiling) • Дополняет множества – точек входа – LiveClasses – VirtCallSites
  43. 43. Результаты • Размер исполняемого файла без зависимостей: – Hello World ~800 KB – SWT Example ~1.4 MB • При агрессивном удалении «ненужных» методов и их метаинформации
  44. 44. JetPerfect (2001) Не такой уж perfect: – не соответствует Java SE спецификации – труден в использовании – приложения «не всегда работают» – возникающие (у конечного пользователя) ошибки не диагностируемы
  45. 45. Java Runxme Slim-­‐Down
  46. 46. Java Runxme Slim-­‐Down (2007) • Глобально оптимизированный исполняемый файл – «нужные» классы приложения и Java платформы оптимизируются совместно • Оставшиеся классы – не удаляются – остается возможность загружать их через JIT
  47. 47. Java Runxme Slim-­‐Down • Java SE API делится на компоненты: – Kernel, XML, SQL, CORBA, AWT/Java2D, Swing, etc. • анализатор определяет какие компоненты “нужны” – содержат достижимые методы
  48. 48. Глобальный анализатор Application Java SE API Entry points - used - not used - component’s boundary
  49. 49. Java Runxme Slim-­‐Down • Пользователю предоставляются: – результаты анализа c возможностью исключить неиспользуемые компоненты
  50. 50. Java Runxme Slim-­‐Down • Исключенные компоненты: – помещаются на веб-­‐сервер (доступны приложению) – загружаются VM по требованию • Соответствует Java SE спецификации!
  51. 51. Результаты
  52. 52. On GUI toolkits • Экономия в размере незначительна, если используется Java2D, AWT/Swing • Что делать?
  53. 53. On GUI toolkits • Экономия в размере незначительна, если используется Java2D, AWT/Swing • Что делать? • Java Core + alternaxve GUI toolkit
  54. 54. Java Core + alternaxve GUI
  55. 55. Java Core + alternaxve GUI Фрагментация Java
  56. 56. Java Core + alternaxve GUI • SWT/JFace • eSWT • Java OpenGL • JavaFX – уже входит в платформу!
  57. 57. JavaFX Packager vs. Runxme Slim-­‐Down 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
  58. 58. Java Runxme Slim-­‐Down: уроки • Компонентная модель JRE для уменьшения приватного Java Runxme – жизнеспособна – работает • Проверено временем
  59. 59. Проект Jigsaw
  60. 60. Проект Jigsaw • Java Module System h.p://openjdk.java.net/projects/jigsaw • Модуляризация JRE – разбиение на компоненты – устранение лишних зависимостей – перевод на Module System
  61. 61. Прототип Java Module System • Доступен по h.p://jdk8.java.net/jigsaw/ • module-info.java – описывает зависимости модуля (JLS, JVM) • .jmod -­‐ бинарный формат модуля • jpkg -­‐ инструмент для упаковки модуля – использует pack200, 7z, bzip • javac, jmod – статическое управление зависимостями • java –m ... -­‐ модульный режим запуска
  62. 62. Jigsaw: модуляризация JRE • Планы: J Ä Java8 Ä • Почему так долго? -­‐ объективные причины
  63. 63. Jigsaw: трудности перевода
  64. 64. Jigsaw: трудности перевода
  65. 65. Jigsaw: проблемы прототипа • Многие зависимости убраны, но многие еще осталось – процесс оказался очень трудоёмкий • Проблемы с обратной совместимостью – getClassLoader() == null – Class.forName() и правила видимости – classloader delegaxon
  66. 66. Jigsaw: текущий статус • Определены новые требования – обратная совместимость – «cвященная корова» • Платформенные модули отличаются от пользовательских – нельзя подключать два платформенных модуля с одной функциональностью разных версий – для пользовательских модулей -­‐ можно
  67. 67. • Не Jigsaw: текущий статус будет клона Maven, Ivy, Gradle • Поддержка нативных пакетных мэнеджеров – Java модуль можно поставить через rpm, yum, etc. – без поддержки Mac, Windows – для Mac, Windows будет инструмент паковки в нативный инсталлятор • AOT компиляция Java модулей – если будет найден proof of concept
  68. 68. 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
  69. 69. Compact Profiles: инструменты • jdeps – инструмент статического анализа зависимостей приложения • javac –profile – предупреждает о зависимостях вне указанного профиля • jrecreate – создает нужный компактный профиль – Есть только в Java SE Embedded!
  70. 70. Compact Profiles: размеры • Compact1: 11MB • Compact2: 15MB • Compact3: 21MB • Full JRE: 49MB Замечание: размеры на диске (ROM)
  71. 71. JEP-­‐178 (Staxcally-­‐Linked JNI libraries) • Распространение без динамических библиотек – реализация naxve-­‐методов линкуется к JVM – единый исполняемый файл • Преодоление существующих барьеров – требования Apple AppStore
  72. 72. Заключение • Компонентная модель JRE – жизнеспособна • Перевод JRE на модульную систему – статический импорт (без лишних зависимостей) – требует времени • Путь Java to Mobile – модульность: Java core + JavaFX – AOT компиляция + JEP-­‐178
  73. 73. Вопросы и ответы Никита Липский, Excelsior nlipsky@excelsior-usa.com twitter: @pjBooms

×