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

Post on 24-May-2015

1.763 views 0 download

description

JavaOne Moscow presentation

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

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*

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

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

mainC.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 Systemhttp://openjdk.java.net/projects/jigsaw/doc/quickstart.htmlhttp://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