2. Java
полнеет
35
30
25
20
15
10
5
0
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
Window
s
x
8
6
,
M
B
3. Распространение
Java
приложений
• Добавить
JRE
в
системные
требования
• Загружать
JRE
перед
установкой
– Java-‐aware
инсталляторы
• Java
Web
Start
• Включить
JRE
в
инсталляцию
(private
JRE)
– увеличивает
размер
на
15-‐30
MB
4. Размер
имеет
значение?
• Server
Side
(Java
EE)
– не
проблема
• Desktop
– зависит
от
приложения
• Mobile
– 30
MB
-‐
неприемлемо
7. Распространение
Java
приложений
Недостающая
возможность:
Private
JRE
маленького
размера,
позволит
• меньше
загружать
из
интернета
• сократить
занимаемое
на
диске
место
• улучшить
User
eXperience
9. Кто
знает
про
Excelsior
JET?
Кто ззннааеетт ппрроо Excelsior JET?
10. Кто
знает
про
Excelsior
JET?
• Полная
реализация
Java
SE
–
c
2005
года
cертифицирована
как
Java
Compaxble
• AOT
compiler
+
Java
Runxme
– смешанная
компиляция:
AOT
+
JIT
– поддержка
нестандартных
загрузчиков
классов
в
AOT
режиме
(для
Eclipse
RCP,
Tomcat)
• Toolkit
– Startup
Opxmizer
– Deployment
13. Small
Private
JRE
Наблюдение:
приложение
использует
далеко
не
все,
что
есть
в
private
JRE.
14. Small
Private
JRE
Наблюдение:
приложение
использует
далеко
не
все,
что
есть
в
private
JRE.
Решение:
удалить
ненужные
классы!
15. Small
Private
JRE
Наблюдение:
приложение
использует
далеко
не
все,
что
есть
в
private
JRE.
Решение:
удалить
ненужные
классы!
Вопрос:
а
какие
классы
-‐
ненужные?
19. • java.lang.Object
–
нужен
• класс
импортированный
нужным,
тоже
нужен
Нужные
классы
20. Нужные
классы
• java.lang.Object
–
нужен
• класс
импортированный
нужным,
тоже
нужен
• замыкание
импорта
Object
содержит...
21. Нужные
классы
• java.lang.Object
–
нужен
• класс
импортированный
нужным,
тоже
нужен
• замыкание
импорта
Object
содержит
3541
класс
(для
Java
8u20)
22. • Замыкание
Нужные
классы
java.lang.*
+
JVM
specific:
3948
классов
• java.lang,
java.io,
java.uxl,
etc.:
4797
классов
23. Нужные
классы
class
ForName
{
public
staxc
void
main(String
args[])
{
Class
c
=
Class.forName(args[0]);
…
}
}
Какие
классы
нужны
этой
программе?
24. • При
Нужные
классы
доступе
через
JNI
и/или
Reflecxon,
неясно:
– нужны
ли
еще
классы?
– если
да,
то
какие?
25. Нужные
методы
public
staxc
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. И
продолжает
что-‐то
качать
…
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)
43. Результаты
• Размер
исполняемого
файла
без
зависимостей:
– Hello
World
~800
KB
– SWT
Example
~1.4
MB
• При
агрессивном
удалении
«ненужных»
методов
и
их
метаинформации
44. JetPerfect
(2001)
Не
такой
уж
perfect:
– не
соответствует
Java
SE
спецификации
– труден
в
использовании
– приложения
«не
всегда
работают»
– возникающие
(у
конечного
пользователя)
ошибки
не
диагностируемы
46. Java
Runxme
Slim-‐Down
(2007)
• Глобально
оптимизированный
исполняемый
файл
– «нужные»
классы
приложения
и
Java
платформы
оптимизируются
совместно
• Оставшиеся
классы
– не
удаляются
– остается
возможность
загружать
их
через
JIT
47. Java
Runxme
Slim-‐Down
• Java
SE
API
делится
на
компоненты:
– Kernel,
XML,
SQL,
CORBA,
AWT/Java2D,
Swing,
etc.
• анализатор
определяет
какие
компоненты
“нужны”
– содержат
достижимые
методы
49. Java
Runxme
Slim-‐Down
• Пользователю
предоставляются:
– результаты
анализа
c
возможностью
исключить
неиспользуемые
компоненты
50. Java
Runxme
Slim-‐Down
• Исключенные
компоненты:
– помещаются
на
веб-‐сервер
(доступны
приложению)
– загружаются
VM
по
требованию
• Соответствует
Java
SE
спецификации!
60. Проект
Jigsaw
• Java
Module
System
h.p://openjdk.java.net/projects/jigsaw
• Модуляризация
JRE
– разбиение
на
компоненты
– устранение
лишних
зависимостей
– перевод
на
Module
System
61. Прототип
Java
Module
System
• Доступен
по
h.p://jdk8.java.net/jigsaw/
• module-info.java
– описывает
зависимости
модуля
(JLS,
JVM)
• .jmod
-‐
бинарный
формат
модуля
• jpkg
-‐
инструмент
для
упаковки
модуля
– использует
pack200,
7z,
bzip
• javac, jmod
–
статическое
управление
зависимостями
• java –m ...
-‐
модульный
режим
запуска
65. Jigsaw:
проблемы
прототипа
• Многие
зависимости
убраны,
но
многие
еще
осталось
– процесс
оказался
очень
трудоёмкий
• Проблемы
с
обратной
совместимостью
– getClassLoader() == null
– Class.forName()
и
правила
видимости
– classloader
delegaxon
66. Jigsaw:
текущий
статус
• Определены
новые
требования
– обратная
совместимость
–
«cвященная
корова»
• Платформенные
модули
отличаются
от
пользовательских
– нельзя
подключать
два
платформенных
модуля
с
одной
функциональностью
разных
версий
– для
пользовательских
модулей
-‐
можно
67. • Не
Jigsaw:
текущий
статус
будет
клона
Maven,
Ivy,
Gradle
• Поддержка
нативных
пакетных
мэнеджеров
– Java
модуль
можно
поставить
через
rpm,
yum,
etc.
– без
поддержки
Mac,
Windows
– для
Mac,
Windows
будет
инструмент
паковки
в
нативный
инсталлятор
• AOT
компиляция
Java
модулей
– если
будет
найден
proof
of
concept
69. Compact
Profiles:
инструменты
• jdeps
–
инструмент
статического
анализа
зависимостей
приложения
• javac –profile
–
предупреждает
о
зависимостях
вне
указанного
профиля
• jrecreate
–
создает
нужный
компактный
профиль
– Есть
только
в
Java
SE
Embedded!
70. Compact
Profiles:
размеры
• Compact1:
11MB
• Compact2:
15MB
• Compact3:
21MB
• Full
JRE:
49MB
Замечание:
размеры
на
диске
(ROM)
71. JEP-‐178
(Staxcally-‐Linked
JNI
libraries)
• Распространение
без
динамических
библиотек
– реализация
naxve-‐методов
линкуется
к
JVM
–
единый
исполняемый
файл
• Преодоление
существующих
барьеров
– требования
Apple
AppStore
72. Заключение
• Компонентная
модель
JRE
– жизнеспособна
• Перевод
JRE
на
модульную
систему
– статический
импорт
(без
лишних
зависимостей)
– требует
времени
• Путь
Java
to
Mobile
– модульность:
Java
core
+
JavaFX
– AOT
компиляция
+
JEP-‐178
73. Вопросы и ответы
Никита Липский,
Excelsior
nlipsky@excelsior-usa.com
twitter: @pjBooms