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

2,291 views

Published on

JavaOne Moscow presentation

1 Comment
1 Like
Statistics
Notes
No Downloads
Views
Total views
2,291
On SlideShare
0
From Embeds
0
Number of Embeds
38
Actions
Shares
0
Downloads
33
Comments
1
Likes
1
Embeds 0
No embeds

No notes for slide

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

  1. 1. Java худеет.Спроси меня как.Виталий МихеевНикита Липский (twitter: @pjBooms)Excelsior LLC
  2. 2. Java полнеет051015202530354045JRE 1.1 JRE 1.2 JRE 1.3 JRE1.4.0JRE1.4.2JRE 5.0 JRE 6 JRE 7 JRE 7U 6JRE 8JRE size, MB
  3. 3. Распространение Java приложений• Добавить JRE в системные требования• Загружать JRE перед установкой– Java-aware инсталляторы• Java Web Start• Включить JRE в инсталляцию (private JRE)– увеличивает размер на 15-40 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?Кто знает про Excelsior JET?Кто знает про Excelsior JET?
  9. 9. Кто знает про Excelsior JET?Кто знает про Excelsior JET?Кто знает про Excelsior JET?
  10. 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. 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 содержит2775 классов (для Java 7u10)Нужные классы
  22. 22. • Замыкание java.lang.* + JVM specific:3380 классов• java.lang,java.io,java.util:3742 классовНужные классы
  23. 23. class ForName {public static void main(String args[]) {Class c = Class.forName(args[0]);…}}Какие классы нужны этой программе?Нужные классы
  24. 24. • При доступе через JNI и/илиReflection, неясно:– нужны ли еще классы?– если да, то какие?Нужные классы
  25. 25. Нужные методыpublic static 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*• Поиск достижимых методов– Начиная с точек входа, строим граф вызовов– Анализируем код методов, накапливаяmainC.foo()B.bar()LiveClasses VirtCallSitesnew 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. Глобальный анализаторApplicationJava SE APIEntry points- used- not used
  41. 41. Reflection & JNI?
  42. 42. Reflection & 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 Runtime Slim-Down
  46. 46. Java Runtime Slim-Down (2007)• Глобально оптимизированныйисполняемый файл– «нужные» классы приложения и Javaплатформы оптимизируются совместно• Оставшиеся классы– не удаляются– остается возможность загружать их через JIT
  47. 47. Java Runtime Slim-Down• Java SE API делится на компоненты:– Kernel, XML, SQL, CORBA, AWT/Java2D, Swing, etc.• анализатор определяет какиекомпоненты “нужны”– содержат достижимые методы
  48. 48. Глобальный анализаторApplicationJava SE APIEntry points- used- not used- component’s boundary
  49. 49. Java Runtime Slim-Down• Пользователю предоставляются:– результаты анализа c возможностью исключитьнеиспользуемые компоненты
  50. 50. Java Runtime 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 + alternative GUI toolkit
  54. 54. Java Core + alternative GUI
  55. 55. Java Core + alternative GUIФрагментация Java
  56. 56. Java Core + alternative GUI• SWT/JFace• eSWT• Java OpenGL• JavaFX– уже входит в платформу!
  57. 57. JavaFX nativePackagerJava RuntimeSlim-DownEnsemble Demo 34 MB 19 MBBrickBreaker 30 MB 13 MBЗамечание: JavaFX завиcит от AWT на момент Java 7u17 JavaFX Packager vs. Runtime Slim-Down
  58. 58. Проект Jigsaw
  59. 59. Проект Jigsaw• Java Module Systemhttp://openjdk.java.net/projects/jigsaw/doc/quickstart.htmlhttp://jdk8.java.net/jigsaw/• Модуляризация JRE– разбиение на компоненты– устранение лишних зависимостей– перевод на Module System
  60. 60. Jigsaw: Java Module System• module-info.java– описывает зависимости модуля (JLS, JVM)• .jmod - бинарный формат модуля• jpkg - инструмент для упаковки модуля– использует pack200, 7z, bzip• javac, jmod – статическое управлениезависимостями• java –m ... - модульный режим запуска
  61. 61. Jigsaw: модуляризация JRE• Планы:Java7 Java8 Java9• Почему так долго?- объективные причины
  62. 62. Jigsaw: трудности перевода
  63. 63. Jigsaw: трудности перевода
  64. 64. • Многие зависимости убраны–еще много осталось• Борьба за обратную совместимость– getClassLoader() == null– Class.forName() и правила видимости–classloader delegationJigsaw: текущий статус
  65. 65. JEP-161 (Compact Profiles)• Замена Java ME CDC• 3 профиля:Compact1 Compact2 Compact3java.lang java.rmi java.lang.instrumentjava.io java.sql java.lang.managementjava.math javax.transaction javax.managementjava.nio javax.xml javax.namingjava.util org.w3c.dom javax.scriptjava.net org.xml.sax javax.securityjava.security javax.sqljavax.crypto javax.xml.cryptojava.text org.ietf.jgss
  66. 66. JEP-178 (Statically-Linked JNI libraries)• Распространение без динамическихбиблиотек– реализация native-методов линкуется к JVM– единый исполняемый файл• Преодоление существующих барьеров– требования Apple AppStore
  67. 67. Заключение• Компонентная модель JRE– жизнеспособна• Перевод JRE на модульную систему– статический импорт (без лишних зависимостей)– требует времени• Путь Java to Mobile– модульность: Java core + JavaFX– AOT компиляция + JEP-178
  68. 68. Вопросы и ответыНикита Липскийtwitter: @pjBoomsemail: nlipsky@excelsior-usa.com

×