68
Java худеет. Спроси меня как. Виталий Михеев Никита Липский (twitter: @pjBooms) Excelsior LLC

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

Embed Size (px)

DESCRIPTION

JavaOne Moscow presentation

Citation preview

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

Java худеет.

Спроси меня как.

Виталий МихеевНикита Липский (twitter: @pjBooms)

Excelsior LLC

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

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 худеет. Спроси меня как

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

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

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

• Java Web Start

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

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

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

• Server Side (Java EE)

– не проблема

• Desktop

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

• Mobile

– 30 MB - неприемлемо

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

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

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

Private JRE …

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

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

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

Private JRE маленького размера

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

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

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

Private JRE маленького размера, позволит

• меньше загружать из интернета

• сократить занимаемое на диске место

• улучшить User eXperience

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

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

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

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

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

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

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

Кто знает про 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 худеет. Спроси меня как

AOT + JIT

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

Small Private JRE

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

Small Private JRE

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

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

Small Private JRE

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

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

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

Small Private JRE

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

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

Вопрос: а какие классы - ненужные?

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

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

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

если он не является

нужным

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

• замыкание импорта Object содержит2775 классов (для Java 7u10)

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

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

• Замыкание java.lang.* + JVM specific:

3380 классов

• java.lang,java.io,java.util:

3742 классов

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

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

class ForName {

public static void main(String args[]) {

Class c = Class.forName(args[0]);

}

}

Какие классы нужны этой программе?

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

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

• При доступе через JNI и/илиReflection, неясно:

– нужны ли еще классы?

– если да, то какие?

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

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

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

public static String foo(Object o) {

return o.toString();

}

Какие методы (каких классов) нужны?

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

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

• Excelsior– single executable

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

• Sun Microsystems – Sun Java Kernel (Consumer JRE)

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

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

Sun Java Kernel

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

Sun Java Kernel (2008)

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

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

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

Sun Java Kernel

Реальность:

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

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

Sun Java Kernel

Реальность:

2. Загруженный инсталлятор, выкачивает другой инсталлятор в 12MB!

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

Sun Java Kernel

Реальность:

3. Затем Java Kernel загружает сразу еще 5MB(13MB + 5MB > 16MB - обычное JRE 6)

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

Sun Java Kernel

Реальность:

4. И продолжает что-то качать …

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

Single Executable

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

Проблемы

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

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

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

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

Наблюдения

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

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

– new T()

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

Rapid Type Analysis*

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

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

mainC.foo()

B.bar()

LiveClasses VirtCallSites

new T() c.bar()

new B() b.foo()

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

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

Rapid Type Analysis*

• при расширении LiveClasses

– добавляем instance-методы в граф согласно VirtCallSites

• при расширении VirtCallSites

– добавляем instance-методы в граф согласно LiveClasses

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

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

Rapid Type Analysis*

• Эффективен

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

• Масштабируем

– линейная сложность от числа операторов

– существует реализация, обрабатывающая более 40,000 классов за 2 минуты

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

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

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

(по результатам RTA)

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

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

Application

Java SE API

Entry points- used

- not used

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

Reflection & JNI?

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

Reflection & JNI?

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

• Дополняет множества

– точек входа

– LiveClasses

– VirtCallSites

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

Результаты

• Размер исполняемого файла без зависимостей:

– Hello World ~800 KB

– SWT Example ~1.4 MB

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

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

JetPerfect (2001)

Не такой уж perfect:

– не соответствует Java SE спецификации

– труден в использовании

– приложения «не всегда работают»

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

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

Java Runtime Slim-Down

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

Java Runtime Slim-Down (2007)

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

платформы оптимизируются совместно

• Оставшиеся классы– не удаляются

– остается возможность загружать их через JIT

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

Java Runtime Slim-Down

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

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

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

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

Application

Java SE API

Entry points- used

- not used

- component’s boundary

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

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

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

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

Java Runtime Slim-Down

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

приложению)

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

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

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

On GUI toolkits

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

• Что делать?

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

On GUI toolkits

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

• Что делать?

• Java Core + alternative GUI toolkit

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

Java Core + alternative GUI

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

Java Core + alternative GUI

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

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

Java Core + alternative GUI

• SWT/JFace

• eSWT

• Java OpenGL

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

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

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 худеет. Спроси меня как

Проект Jigsaw

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

Проект Jigsaw

• Java Module Systemhttp://openjdk.java.net/projects/jigsaw/doc/quickstart.htmlhttp://jdk8.java.net/jigsaw/

• Модуляризация JRE– разбиение на компоненты

– устранение лишних зависимостей

– перевод на Module System

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

Jigsaw: Java Module System

• module-info.java

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

• .jmod - бинарный формат модуля

• jpkg - инструмент для упаковки модуля

– использует pack200, 7z, bzip

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

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

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

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

• Планы:

Java7 Java8

Java9

• Почему так долго?

- объективные причины

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

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

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

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

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

• Многие зависимости убраны

– еще много осталось

• Борьба за обратную совместимость– getClassLoader() == null

– Class.forName() и правила видимости

– classloader delegation

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

Page 65: 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.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 худеет. Спроси меня как

JEP-178 (Statically-Linked JNI libraries)

• Распространение без динамических библиотек– реализация native-методов линкуется к JVM

– единый исполняемый файл

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

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

Заключение

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

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

– требует времени

• Путь Java to Mobile– модульность: Java core + JavaFX

– AOT компиляция + JEP-178

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

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

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

twitter: @pjBooms

email: [email protected]