73
Java худеет. Спроси меня как. Никита Липский twi.er: @pjBooms Excelsior LLC

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

Embed Size (px)

DESCRIPTION

#JavaDayKiev presentation

Citation preview

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

Java  худеет.    Спроси  меня  как.      Никита      Липский    twi.er:  @pjBooms  

Excelsior  LLC  

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

Java  полнеет  

0  

5  

10  

15  

20  

25  

30  

35  

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  Windows  x86,  MB  

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

Распространение  Java  приложений  

•  Добавить  JRE  в  системные  требования  

•  Загружать  JRE  перед  установкой    –  Java-­‐aware  инсталляторы  

•  Java  Web  Start  

•  Включить  JRE    в  инсталляцию  (private  JRE)    –  увеличивает  размер  на  15-­‐30  MB  

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

Размер  имеет  значение?  

•  Server  Side  (Java  EE)  – не  проблема  

•  Desktop  – зависит  от  приложения  

•  Mobile  – 30  MB  -­‐  неприемлемо  

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

Распространение  Java  приложений  

Недостающая  возможность:    Private  JRE  …  

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

Распространение  Java  приложений  

Недостающая  возможность:    Private  JRE  маленького  размера  

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

Распространение  Java  приложений  

Недостающая  возможность:    Private  JRE  маленького  размера,  позволит  •  меньше  загружать  из  интернета  •  сократить  занимаемое  на  диске  место  •  улучшить  User  eXperience  

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

Кто  знает  про  Excelsior  JET?  

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

Кто  знает  про  Excelsior  JET?    

Кто знает про Excelsior JET? Кто знает про Excelsior JET?

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

Кто  знает  про  Excelsior  JET?    •  Полная  реализация  Java  SE  

–   c  2005  года  cертифицирована  как  Java  Compaxble    

•  AOT  compiler  +  Java  Runxme  –  смешанная  компиляция:  AOT  +  JIT  –  поддержка  нестандартных  загрузчиков  классов  в  AOT  режиме  (для  Eclipse  RCP,  Tomcat)  

   •  Toolkit  

–  Startup  Opxmizer  – Deployment  

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

AOT  +  JIT  

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

Small  Private  JRE  

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

Small  Private  JRE  

Наблюдение:  приложение  использует  далеко  не  все,  что  есть  в  private  JRE.  

   

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

Small  Private  JRE  

Наблюдение:  приложение  использует  далеко  не  все,  что  есть  в  private  JRE.  

 

Решение:  удалить  ненужные  классы!      

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

Small  Private  JRE  

Наблюдение:  приложение  использует  далеко  не  все,  что  есть  в  private  JRE.  

 

Решение:  удалить  ненужные  классы!    Вопрос:  а  какие  классы  -­‐  ненужные?    

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

“Ненужные”  классы  

 Класс  не  нужен,    

если  он  не  является    нужным  

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

Нужные  классы  

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

•  java.lang.Object  –  нужен  

Нужные  классы  

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

•  java.lang.Object  –  нужен  

•  класс  импортированный  нужным,  тоже  нужен  

Нужные  классы  

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

•  java.lang.Object  –  нужен  

•  класс  импортированный  нужным,  тоже  нужен  

•  замыкание  импорта  Object  содержит...  

Нужные  классы  

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

•  java.lang.Object  –  нужен  

•  класс  импортированный  нужным,  тоже  нужен  

•  замыкание  импорта  Object  содержит  3541  класс  (для  Java  8u20)  

Нужные  классы  

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

•  Замыкание  java.lang.*  +  JVM  specific:      3948      классов  

•  java.lang,  java.io,  java.uxl,  etc.:  

4797      классов    

Нужные  классы  

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

class  ForName  {          public  staxc  void  main(String  args[])  {                        Class  c  =  Class.forName(args[0]);                          …          }          }    Какие  классы  нужны  этой  программе?    

Нужные  классы  

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

•  При  доступе  через  JNI  и/или  Reflecxon,  неясно:  –  нужны  ли  еще  классы?  –  если  да,  то  какие?  

Нужные  классы  

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

Нужные  методы  

public  staxc  String  foo(Object  o)  {          return  o.toString();          }      Какие  методы  (каких  классов)  нужны?  

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

Ранние  попытки  уменьшить  JRE  

•  Excelsior  – single  executable  – оптимизация  в  предположении  “замкнутости  мира”  

•  Sun  Microsystems    – Sun  Java  Kernel  (Consumer  JRE)    

•  Остальные  реализации  Java?  –   не  важно  для  Java  ME,  Java  EE  

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

Sun  Java  Kernel  

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

Sun  Java  Kernel  (2008)    

Идея:  установить  минимум  и  загружать  по  мере  необходимости,  пока  не  получится  полное  JRE  

 Ожидаемый  результат:  быстрый  старт  приложения  на  машине,  где  нет  Java  

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

Sun  Java  Kernel    

Реальность:  1.  Выкачивается  инсталлятор  в  900KB  

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

Sun  Java  Kernel    

Реальность:  2.  Загруженный  инсталлятор,  выкачивает  

другой  инсталлятор  в  12MB!    

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

Sun  Java  Kernel  

Реальность:  3.  Затем  Java  Kernel  загружает  сразу  еще  5MB  

(13MB  +  5MB  >  16MB  -­‐  обычное  JRE  6)  

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

Sun  Java  Kernel    

Реальность:  4.  И  продолжает  что-­‐то  качать  …  

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

Single  Executable  

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

Проблемы  

1.  “Клубки"  импорта  

2.  Виртуальные  вызовы  

3. Мета-­‐доступ  

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

Наблюдения  

1.  Не  все  методы  “нужного”  класса  исполняются  

2.  Instance-­‐методы  не  могут  исполняться,  если  не  создан  экземпляр  класса  (или  его  наследника)    

–  new T()

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

Rapid  Type  Analysis*  

•  Поиск  достижимых  методов  –  Начиная  с  точек  входа,  строим  граф  вызовов  

–  Анализируем  код  методов,  накапливая  

main  C.foo()

B.bar()

LiveClasses   VirtCallSites  new  T()   c.bar()  new  B()   b.foo()  

* Идея принадлежит D.F. Bacon @ IBM

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

Rapid  Type  Analysis*  

•  при  расширении  LiveClasses  –   добавляем  instance-­‐методы  в  граф  согласно  VirtCallSites  

•  при  расширении  VirtCallSites  –   добавляем  instance-­‐методы  в  граф  согласно  LiveClasses  

•  достигаем  неподвижной  точки  

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

Rapid  Type  Analysis*  

•  Эффективен  –   для  «прореживания»  библиотек    

•  Масштабируем  – линейная  сложность  от  числа  операторов  – существует  реализация,  обрабатывающая  более  40,000  классов  за  2  минуты  

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

Нужные  классы  

 Класс  нужен,  если  он  содержит  

достижимые  методы  (по  результатам  RTA)  

 

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

Глобальный  анализатор  

Application

Java SE API

Entry points - used - not used

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

Reflecxon  &  JNI?  

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

Reflecxon  &  JNI?  

•  Пробный  запуск  (off-­‐line  profiling)  

•  Дополняет  множества  – точек  входа  – LiveClasses  – VirtCallSites  

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

Результаты  

•  Размер  исполняемого  файла  без  зависимостей:  – Hello  World    ~800  KB    – SWT  Example    ~1.4  MB    

•  При  агрессивном  удалении  «ненужных»  методов  и  их  метаинформации  

 

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

JetPerfect  (2001)  

Не  такой  уж  perfect:  –  не  соответствует  Java  SE  спецификации    –  труден  в  использовании  –  приложения  «не  всегда  работают»  –  возникающие  (у  конечного  

пользователя)  ошибки  не  диагностируемы  

 

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

Java  Runxme  Slim-­‐Down  

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

Java  Runxme  Slim-­‐Down  (2007)  

•  Глобально  оптимизированный  исполняемый  файл    – «нужные»  классы  приложения  и  Java  платформы  оптимизируются  совместно  

•  Оставшиеся  классы  – не  удаляются  – остается  возможность  загружать  их  через  JIT    

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

Java  Runxme  Slim-­‐Down  

•  Java  SE  API  делится  на  компоненты:  – Kernel,  XML,  SQL,  CORBA,  AWT/Java2D,  Swing,  etc.  

•  анализатор  определяет  какие  компоненты  “нужны”  – содержат  достижимые  методы  

 

 

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

Глобальный  анализатор  

Application

Java SE API

Entry points - used - not used - component’s boundary

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

Java  Runxme  Slim-­‐Down  •  Пользователю  предоставляются:  

– результаты  анализа  c  возможностью  исключить  неиспользуемые  компоненты  

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

Java  Runxme  Slim-­‐Down  

•  Исключенные  компоненты:  – помещаются  на  веб-­‐сервер  (доступны  приложению)  

– загружаются  VM  по  требованию    

•  Соответствует  Java  SE  спецификации!  

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

Результаты  

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

On  GUI  toolkits  

•  Экономия  в  размере  незначительна,  если  используется  Java2D,  AWT/Swing    

•  Что  делать?    

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

On  GUI  toolkits  

•  Экономия  в  размере  незначительна,  если  используется  Java2D,  AWT/Swing    

•  Что  делать?  

•  Java  Core  +  alternaxve  GUI  toolkit  

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

Java  Core  +  alternaxve  GUI  

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

Java  Core  +  alternaxve  GUI  

Фрагментация  Java  

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

Java  Core  +  alternaxve  GUI  

•  SWT/JFace  •  eSWT  •  Java  OpenGL  •  JavaFX    

– уже  входит  в  платформу!  

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

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  

JavaFX  Packager  vs.  Runxme  Slim-­‐Down    

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

Java  Runxme  Slim-­‐Down:  уроки  

•  Компонентная  модель  JRE  для  уменьшения  приватного  Java  Runxme  – жизнеспособна    – работает  

•  Проверено  временем    

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

Проект  Jigsaw  

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

Проект  Jigsaw  

•  Java  Module  System  h.p://openjdk.java.net/projects/jigsaw    

•  Модуляризация  JRE  – разбиение  на  компоненты  – устранение  лишних  зависимостей  – перевод  на  Module  System  

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

Прототип  Java  Module  System  •  Доступен  по  h.p://jdk8.java.net/jigsaw/  •  module-info.java  

– описывает  зависимости  модуля  (JLS,  JVM)  

•  .jmod  -­‐  бинарный  формат  модуля  •  jpkg  -­‐  инструмент  для  упаковки  модуля  

– использует  pack200,  7z,  bzip  •  javac, jmod  –  статическое  управление  зависимостями  

•  java –m ...  -­‐  модульный  режим  запуска  

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

Jigsaw:  модуляризация  JRE  

•  Планы:        J                                            Ä  Java8                             Ä  

•  Почему  так  долго?  -­‐  объективные  причины  

 

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

Jigsaw:  трудности  перевода  

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

Jigsaw:  трудности  перевода  

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

•  Многие  зависимости  убраны,  но  многие  еще  осталось  – процесс  оказался  очень  трудоёмкий  

 •  Проблемы  с  обратной  совместимостью  

–  getClassLoader() == null –  Class.forName()  и  правила  видимости  – classloader  delegaxon  

Jigsaw:  проблемы  прототипа  

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

•  Определены  новые  требования  – обратная  совместимость  –  «cвященная  корова»  

•  Платформенные  модули  отличаются  от  пользовательских  – нельзя  подключать  два  платформенных  модуля  с  одной  функциональностью  разных  версий  

– для  пользовательских  модулей    -­‐    можно      

Jigsaw:  текущий  статус  

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

•  Не  будет  клона  Maven,  Ivy,  Gradle  •  Поддержка  нативных  пакетных  мэнеджеров

– Java  модуль  можно  поставить  через  rpm,  yum,  etc.  

– без  поддержки  Mac,  Windows  – для  Mac,  Windows  будет  инструмент  паковки  в  нативный  инсталлятор  

•  AOT  компиляция  Java  модулей  –  если  будет  найден  proof  of  concept  

Jigsaw:  текущий  статус  

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

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  

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

Compact  Profiles:  инструменты  •  jdeps  –  инструмент  статического  анализа  зависимостей  приложения      

•  javac –profile  –  предупреждает  о    зависимостях  вне  указанного  профиля  

•  jrecreate  –  создает  нужный  компактный  профиль      – Есть  только  в  Java  SE  Embedded!  

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

Compact  Profiles:  размеры  •  Compact1:  11MB  

•  Compact2:  15MB  

•  Compact3:  21MB  

•  Full  JRE:  49MB      Замечание:  размеры  на  диске  (ROM)  

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

JEP-­‐178  (Staxcally-­‐Linked  JNI  libraries)  

•  Распространение  без  динамических  библиотек  – реализация  naxve-­‐методов  линкуется  к  JVM  –   единый  исполняемый  файл  

•  Преодоление  существующих  барьеров  – требования  Apple  AppStore  

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

Заключение  

•  Компонентная  модель  JRE  – жизнеспособна  

•  Перевод  JRE  на  модульную  систему  – статический  импорт  (без  лишних  зависимостей)  – требует  времени  

•  Путь  Java  to  Mobile      – модульность:  Java  core  +  JavaFX  – AOT  компиляция  +  JEP-­‐178    

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

Вопросы и ответы

Никита Липский, Excelsior

[email protected] twitter: @pjBooms