SlideShare a Scribd company logo
1 of 68
Download to read offline
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

More Related Content

What's hot

Java 9 Модули. Почему не OSGi?
Java 9 Модули. Почему не OSGi?Java 9 Модули. Почему не OSGi?
Java 9 Модули. Почему не OSGi?Nikita Lipsky
 
Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Nikita Lipsky
 
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 днейГотовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 днейSkillFactory
 
Java весна 2014 лекция 1
Java весна 2014 лекция 1Java весна 2014 лекция 1
Java весна 2014 лекция 1Technopark
 
Java 9 модули
Java 9 модулиJava 9 модули
Java 9 модулиZheka Kozlov
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1Technopark
 
Синхронизация без блокировок и СМС
Синхронизация без блокировок и СМССинхронизация без блокировок и СМС
Синхронизация без блокировок и СМСAlexey Fyodorov
 
Java 8 Support at the JVM Level
Java 8 Support at the JVM LevelJava 8 Support at the JVM Level
Java 8 Support at the JVM LevelNikita Lipsky
 
Загрузчики классов в Java - коллекция граблей
Загрузчики классов в Java - коллекция граблейЗагрузчики классов в Java - коллекция граблей
Загрузчики классов в Java - коллекция граблейAnton Arhipov
 
Functional reactive full stack development in java/js (JPoint ed.)
Functional reactive full stack development in java/js (JPoint ed.)Functional reactive full stack development in java/js (JPoint ed.)
Functional reactive full stack development in java/js (JPoint ed.)Vyacheslav Lapin
 
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...CodeFest
 
Практический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQLПрактический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQLAlex Chistyakov
 
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...DevDay
 
Tech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция JavaTech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция JavaTech Talks @NSU
 
Cоциальный граф "Одноклассников" в myTarget
Cоциальный граф "Одноклассников" в myTargetCоциальный граф "Одноклассников" в myTarget
Cоциальный граф "Одноклассников" в myTargetOleg Tsarev
 
Erlang for Yandex
Erlang for YandexErlang for Yandex
Erlang for YandexMax Lapshin
 
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай КондратовБыстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай КондратовFuenteovejuna
 

What's hot (19)

Java 9 Модули. Почему не OSGi?
Java 9 Модули. Почему не OSGi?Java 9 Модули. Почему не OSGi?
Java 9 Модули. Почему не OSGi?
 
Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET
 
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 днейГотовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
 
Java весна 2014 лекция 1
Java весна 2014 лекция 1Java весна 2014 лекция 1
Java весна 2014 лекция 1
 
Java 9 модули
Java 9 модулиJava 9 модули
Java 9 модули
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1
 
Java 9 - Back to the Future
Java 9 - Back to the FutureJava 9 - Back to the Future
Java 9 - Back to the Future
 
Синхронизация без блокировок и СМС
Синхронизация без блокировок и СМССинхронизация без блокировок и СМС
Синхронизация без блокировок и СМС
 
Java 8 Support at the JVM Level
Java 8 Support at the JVM LevelJava 8 Support at the JVM Level
Java 8 Support at the JVM Level
 
Загрузчики классов в Java - коллекция граблей
Загрузчики классов в Java - коллекция граблейЗагрузчики классов в Java - коллекция граблей
Загрузчики классов в Java - коллекция граблей
 
Сервлеты
СервлетыСервлеты
Сервлеты
 
Functional reactive full stack development in java/js (JPoint ed.)
Functional reactive full stack development in java/js (JPoint ed.)Functional reactive full stack development in java/js (JPoint ed.)
Functional reactive full stack development in java/js (JPoint ed.)
 
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
 
Практический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQLПрактический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQL
 
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
 
Tech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция JavaTech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция Java
 
Cоциальный граф "Одноклассников" в myTarget
Cоциальный граф "Одноклассников" в myTargetCоциальный граф "Одноклассников" в myTarget
Cоциальный граф "Одноклассников" в myTarget
 
Erlang for Yandex
Erlang for YandexErlang for Yandex
Erlang for Yandex
 
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай КондратовБыстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
 

Viewers also liked

Секреты сборки мусора в Java
Секреты сборки мусора в JavaСекреты сборки мусора в Java
Секреты сборки мусора в Javaaragozin
 
Expert Java Day: Java concurrency
Expert Java Day: Java concurrencyExpert Java Day: Java concurrency
Expert Java Day: Java concurrencyPavel Titkov
 
Java Core. Lecture# 1. Intro
Java Core. Lecture# 1. IntroJava Core. Lecture# 1. Intro
Java Core. Lecture# 1. IntroAnton Moiseenko
 
Продуктивная разработка Java EE-приложений с применением Oracle ADF
Продуктивная разработка Java EE-приложений с применением Oracle ADFПродуктивная разработка Java EE-приложений с применением Oracle ADF
Продуктивная разработка Java EE-приложений с применением Oracle ADFDmitry Nefedkin
 
Java Enterprise without Java
Java Enterprise without JavaJava Enterprise without Java
Java Enterprise without JavaOlena Syrota
 
Lec 2 Java
Lec 2 JavaLec 2 Java
Lec 2 Javaitc73
 
Какой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис ЦыплаковКакой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис ЦыплаковAlex Tumanoff
 
Введение в веб каркас Struts2
Введение в веб каркас Struts2Введение в веб каркас Struts2
Введение в веб каркас Struts2Evgeniy Krivosheev
 
WDB005.1 - JavaScript for Java Developers (Lecture 1)
WDB005.1 - JavaScript for Java Developers (Lecture 1)WDB005.1 - JavaScript for Java Developers (Lecture 1)
WDB005.1 - JavaScript for Java Developers (Lecture 1)Igor Khotin
 
Keynote on JavaDay Omsk 2014 about new features in Java 8
Keynote on JavaDay Omsk 2014 about new features in Java 8Keynote on JavaDay Omsk 2014 about new features in Java 8
Keynote on JavaDay Omsk 2014 about new features in Java 8Alexey Zinoviev
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Javametaform
 
Date & Time in Java SE 8
Date & Time in Java SE 8Date & Time in Java SE 8
Date & Time in Java SE 8Ilya Lapitan
 

Viewers also liked (14)

Секреты сборки мусора в Java
Секреты сборки мусора в JavaСекреты сборки мусора в Java
Секреты сборки мусора в Java
 
Expert Java Day: Java concurrency
Expert Java Day: Java concurrencyExpert Java Day: Java concurrency
Expert Java Day: Java concurrency
 
Java Core. Lecture# 1. Intro
Java Core. Lecture# 1. IntroJava Core. Lecture# 1. Intro
Java Core. Lecture# 1. Intro
 
Java: вчера, сегодня, завтра
Java: вчера, сегодня, завтраJava: вчера, сегодня, завтра
Java: вчера, сегодня, завтра
 
Продуктивная разработка Java EE-приложений с применением Oracle ADF
Продуктивная разработка Java EE-приложений с применением Oracle ADFПродуктивная разработка Java EE-приложений с применением Oracle ADF
Продуктивная разработка Java EE-приложений с применением Oracle ADF
 
Java Enterprise without Java
Java Enterprise without JavaJava Enterprise without Java
Java Enterprise without Java
 
Lec 2 Java
Lec 2 JavaLec 2 Java
Lec 2 Java
 
Какой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис ЦыплаковКакой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис Цыплаков
 
Введение в веб каркас Struts2
Введение в веб каркас Struts2Введение в веб каркас Struts2
Введение в веб каркас Struts2
 
WDB005.1 - JavaScript for Java Developers (Lecture 1)
WDB005.1 - JavaScript for Java Developers (Lecture 1)WDB005.1 - JavaScript for Java Developers (Lecture 1)
WDB005.1 - JavaScript for Java Developers (Lecture 1)
 
Основы Java. 4. Web
Основы Java. 4. WebОсновы Java. 4. Web
Основы Java. 4. Web
 
Keynote on JavaDay Omsk 2014 about new features in Java 8
Keynote on JavaDay Omsk 2014 about new features in Java 8Keynote on JavaDay Omsk 2014 about new features in Java 8
Keynote on JavaDay Omsk 2014 about new features in Java 8
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
Date & Time in Java SE 8
Date & Time in Java SE 8Date & Time in Java SE 8
Date & Time in Java SE 8
 

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

Доклады с прошедшей JiraMania: про обновления, зависимости и дедлоки
Доклады с прошедшей JiraMania: про обновления, зависимости и дедлокиДоклады с прошедшей JiraMania: про обновления, зависимости и дедлоки
Доклады с прошедшей JiraMania: про обновления, зависимости и дедлокиGonchik Tsymzhitov
 
Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?buranLcme
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaAlex Chistyakov
 
JPHP - О проекте на простом языке
JPHP - О проекте на простом языкеJPHP - О проекте на простом языке
JPHP - О проекте на простом языкеDmitry Zaytsev
 
Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»e-Legion
 
YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011CodeCamp
 
Что такое Java? Кто такой Java разработчик?
Что такое Java? Кто такой Java разработчик?Что такое Java? Кто такой Java разработчик?
Что такое Java? Кто такой Java разработчик?GetITAbroad
 
Java Platform Performance BoF
Java Platform Performance BoFJava Platform Performance BoF
Java Platform Performance BoFDmitry Buzdin
 
AOT-компиляция Java
AOT-компиляция JavaAOT-компиляция Java
AOT-компиляция JavaTech Talks @NSU
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned Alexander Syrotenko
 
развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)guest40e031
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Serversrit2010
 
Занимательные истории из жизни технической поддержки JVM
Занимательные истории из жизни технической поддержки JVMЗанимательные истории из жизни технической поддержки JVM
Занимательные истории из жизни технической поддержки JVMNikita Lipsky
 
Использование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестированияИспользование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестированияSQALab
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularizationIvan Krylov
 
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)Pavel Tsukanov
 
Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)Ontico
 

Similar to Java худеет. Спроси меня как. (20)

Доклады с прошедшей JiraMania: про обновления, зависимости и дедлоки
Доклады с прошедшей JiraMania: про обновления, зависимости и дедлокиДоклады с прошедшей JiraMania: про обновления, зависимости и дедлоки
Доклады с прошедшей JiraMania: про обновления, зависимости и дедлоки
 
Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на Java
 
JPHP - О проекте на простом языке
JPHP - О проекте на простом языкеJPHP - О проекте на простом языке
JPHP - О проекте на простом языке
 
Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»
 
YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011
 
Что такое Java? Кто такой Java разработчик?
Что такое Java? Кто такой Java разработчик?Что такое Java? Кто такой Java разработчик?
Что такое Java? Кто такой Java разработчик?
 
Java Platform Performance BoF
Java Platform Performance BoFJava Platform Performance BoF
Java Platform Performance BoF
 
Java 9 - кратко о новом
Java 9 -  кратко о новомJava 9 -  кратко о новом
Java 9 - кратко о новом
 
AOT-компиляция Java
AOT-компиляция JavaAOT-компиляция Java
AOT-компиляция Java
 
A.pleshkov
A.pleshkovA.pleshkov
A.pleshkov
 
2 bdw.key
2 bdw.key2 bdw.key
2 bdw.key
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned
 
развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Servers
 
Занимательные истории из жизни технической поддержки JVM
Занимательные истории из жизни технической поддержки JVMЗанимательные истории из жизни технической поддержки JVM
Занимательные истории из жизни технической поддержки JVM
 
Использование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестированияИспользование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестирования
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularization
 
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
 
Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)
 

More from Nikita Lipsky

Escaping The Jar hell with Jigsaw Layers
Escaping The Jar hell with Jigsaw LayersEscaping The Jar hell with Jigsaw Layers
Escaping The Jar hell with Jigsaw LayersNikita Lipsky
 
JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...
JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...
JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...Nikita Lipsky
 
Java 9 Modules: The Duke Yet Lives That OSGi Shall Depose
Java 9 Modules: The Duke Yet Lives That OSGi Shall DeposeJava 9 Modules: The Duke Yet Lives That OSGi Shall Depose
Java 9 Modules: The Duke Yet Lives That OSGi Shall DeposeNikita Lipsky
 
AOT для Java: Мифы и Challenges
AOT для Java: Мифы и ChallengesAOT для Java: Мифы и Challenges
AOT для Java: Мифы и ChallengesNikita Lipsky
 
JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers
JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers
JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers Nikita Lipsky
 
Верификация Java байткода: когда, как, а может отключить?
Верификация Java байткода: когда, как, а может отключить?Верификация Java байткода: когда, как, а может отключить?
Верификация Java байткода: когда, как, а может отключить?Nikita Lipsky
 
Ahead-Of-Time Compilation of Java Applications
Ahead-Of-Time Compilation of Java ApplicationsAhead-Of-Time Compilation of Java Applications
Ahead-Of-Time Compilation of Java ApplicationsNikita Lipsky
 
Delivering Native User Experience In Client Side Java Applications
Delivering Native User Experience In Client Side Java ApplicationsDelivering Native User Experience In Client Side Java Applications
Delivering Native User Experience In Client Side Java ApplicationsNikita Lipsky
 
Java Restart with WebFX
Java Restart with WebFX Java Restart with WebFX
Java Restart with WebFX Nikita Lipsky
 
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?Веб 3.0. Есть ли будущее у Java в RIA и Mobile?
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?Nikita Lipsky
 
Неумолимая близость десктопа, веба и мобайла
Неумолимая близость десктопа, веба и мобайлаНеумолимая близость десктопа, веба и мобайла
Неумолимая близость десктопа, веба и мобайлаNikita Lipsky
 
История одной JVM в картинках
История одной JVM в картинкахИстория одной JVM в картинках
История одной JVM в картинкахNikita Lipsky
 

More from Nikita Lipsky (12)

Escaping The Jar hell with Jigsaw Layers
Escaping The Jar hell with Jigsaw LayersEscaping The Jar hell with Jigsaw Layers
Escaping The Jar hell with Jigsaw Layers
 
JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...
JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...
JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...
 
Java 9 Modules: The Duke Yet Lives That OSGi Shall Depose
Java 9 Modules: The Duke Yet Lives That OSGi Shall DeposeJava 9 Modules: The Duke Yet Lives That OSGi Shall Depose
Java 9 Modules: The Duke Yet Lives That OSGi Shall Depose
 
AOT для Java: Мифы и Challenges
AOT для Java: Мифы и ChallengesAOT для Java: Мифы и Challenges
AOT для Java: Мифы и Challenges
 
JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers
JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers
JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers
 
Верификация Java байткода: когда, как, а может отключить?
Верификация Java байткода: когда, как, а может отключить?Верификация Java байткода: когда, как, а может отключить?
Верификация Java байткода: когда, как, а может отключить?
 
Ahead-Of-Time Compilation of Java Applications
Ahead-Of-Time Compilation of Java ApplicationsAhead-Of-Time Compilation of Java Applications
Ahead-Of-Time Compilation of Java Applications
 
Delivering Native User Experience In Client Side Java Applications
Delivering Native User Experience In Client Side Java ApplicationsDelivering Native User Experience In Client Side Java Applications
Delivering Native User Experience In Client Side Java Applications
 
Java Restart with WebFX
Java Restart with WebFX Java Restart with WebFX
Java Restart with WebFX
 
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?Веб 3.0. Есть ли будущее у Java в RIA и Mobile?
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?
 
Неумолимая близость десктопа, веба и мобайла
Неумолимая близость десктопа, веба и мобайлаНеумолимая близость десктопа, веба и мобайла
Неумолимая близость десктопа, веба и мобайла
 
История одной JVM в картинках
История одной JVM в картинкахИстория одной JVM в картинках
История одной JVM в картинках
 

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

  • 1. Java худеет. Спроси меня как. Виталий Михеев Никита Липский (twitter: @pjBooms) Excelsior LLC
  • 2. 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
  • 3. Распространение Java приложений • Добавить JRE в системные требования • Загружать JRE перед установкой – Java-aware инсталляторы • Java Web Start • Включить JRE в инсталляцию (private JRE) – увеличивает размер на 15-40 MB
  • 4. Размер имеет значение? • Server Side (Java EE) –не проблема • Desktop –зависит от приложения • Mobile –30 MB - неприемлемо
  • 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
  • 13. Small Private JRE Наблюдение: приложение использует далеко не все, что есть в private JRE.
  • 14. Small Private JRE Наблюдение: приложение использует далеко не все, что есть в private JRE. Решение: удалить ненужные классы!
  • 15. Small Private JRE Наблюдение: приложение использует далеко не все, что есть в private JRE. Решение: удалить ненужные классы! Вопрос: а какие классы - ненужные?
  • 16. “Ненужные” классы Класс не нужен, если он не является нужным
  • 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 { public static void main(String args[]) { Class c = Class.forName(args[0]); … } } Какие классы нужны этой программе? Нужные классы
  • 24. • При доступе через JNI и/или Reflection, неясно: – нужны ли еще классы? – если да, то какие? Нужные классы
  • 25. Нужные методы public static String foo(Object o) { return o.toString(); } Какие методы (каких классов) нужны?
  • 26. Ранние попытки уменьшить JRE • Excelsior – single executable – оптимизация в предположении “замкнутости мира” • Sun Microsystems – Sun Java Kernel (Consumer JRE) • Остальные реализации Java? – не важно для Java ME, Java EE
  • 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. И продолжает что-то качать …
  • 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)
  • 42. Reflection & JNI? • Пробный запуск (off-line profiling) • Дополняет множества – точек входа – LiveClasses – VirtCallSites
  • 43. Результаты • Размер исполняемого файла без зависимостей: – Hello World ~800 KB – SWT Example ~1.4 MB • При агрессивном удалении «ненужных» методов и их метаинформации
  • 44. JetPerfect (2001) Не такой уж perfect: – не соответствует Java SE спецификации – труден в использовании – приложения «не всегда работают» – возникающие (у конечного пользователя) ошибки не диагностируемы
  • 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 SE API Entry points - used - not used - component’s boundary
  • 49. Java Runtime Slim-Down • Пользователю предоставляются: – результаты анализа c возможностью исключить неиспользуемые компоненты
  • 50. Java Runtime Slim-Down • Исключенные компоненты: – помещаются на веб-сервер (доступны приложению) – загружаются VM по требованию • Соответствует Java SE спецификации!
  • 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 Ensemble Demo 34 MB 19 MB BrickBreaker 30 MB 13 MB Замечание: JavaFX завиcит от AWT на момент Java 7u17  JavaFX Packager vs. Runtime Slim-Down
  • 59. Проект Jigsaw • Java Module System http://openjdk.java.net/projects/jigsaw/doc/quickstart.html http://jdk8.java.net/jigsaw/ • Модуляризация JRE – разбиение на компоненты – устранение лишних зависимостей – перевод на Module System
  • 60. Jigsaw: Java Module System • module-info.java – описывает зависимости модуля (JLS, JVM) • .jmod - бинарный формат модуля • jpkg - инструмент для упаковки модуля – использует pack200, 7z, bzip • javac, jmod – статическое управление зависимостями • java –m ... - модульный режим запуска
  • 61. Jigsaw: модуляризация JRE • Планы: Java7  Java8  Java9 • Почему так долго? - объективные причины
  • 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 JNI libraries) • Распространение без динамических библиотек – реализация native-методов линкуется к JVM – единый исполняемый файл • Преодоление существующих барьеров – требования Apple AppStore
  • 67. Заключение • Компонентная модель JRE – жизнеспособна • Перевод JRE на модульную систему – статический импорт (без лишних зависимостей) – требует времени • Путь Java to Mobile – модульность: Java core + JavaFX – AOT компиляция + JEP-178
  • 68. Вопросы и ответы Никита Липский twitter: @pjBooms email: nlipsky@excelsior-usa.com