SlideShare une entreprise Scribd logo
1  sur  73
Télécharger pour lire hors ligne
Java 
худеет. 
Спроси 
меня 
как. 
Никита 
Липский 
twi.er: 
@pjBooms 
Excelsior 
LLC
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
Распространение 
Java 
приложений 
• Добавить 
JRE 
в 
системные 
требования 
• Загружать 
JRE 
перед 
установкой 
– Java-­‐aware 
инсталляторы 
• Java 
Web 
Start 
• Включить 
JRE 
в 
инсталляцию 
(private 
JRE) 
– увеличивает 
размер 
на 
15-­‐30 
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? 
• Полная 
реализация 
Java 
SE 
– 
c 
2005 
года 
cертифицирована 
как 
Java 
Compaxble 
• AOT 
compiler 
+ 
Java 
Runxme 
– смешанная 
компиляция: 
AOT 
+ 
JIT 
– поддержка 
нестандартных 
загрузчиков 
классов 
в 
AOT 
режиме 
(для 
Eclipse 
RCP, 
Tomcat) 
• Toolkit 
– Startup 
Opxmizer 
– 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 
содержит 
3541 
класс 
(для 
Java 
8u20)
• Замыкание 
Нужные 
классы 
java.lang.* 
+ 
JVM 
specific: 
3948 
классов 
• java.lang, 
java.io, 
java.uxl, 
etc.: 
4797 
классов
Нужные 
классы 
class 
ForName 
{ 
public 
staxc 
void 
main(String 
args[]) 
{ 
Class 
c 
= 
Class.forName(args[0]); 
… 
} 
} 
Какие 
классы 
нужны 
этой 
программе?
• При 
Нужные 
классы 
доступе 
через 
JNI 
и/или 
Reflecxon, 
неясно: 
– нужны 
ли 
еще 
классы? 
– если 
да, 
то 
какие?
Нужные 
методы 
public 
staxc 
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
Reflecxon 
& 
JNI?
Reflecxon 
& 
JNI? 
• Пробный 
запуск 
(off-­‐line 
profiling) 
• Дополняет 
множества 
– точек 
входа 
– LiveClasses 
– VirtCallSites
Результаты 
• Размер 
исполняемого 
файла 
без 
зависимостей: 
– Hello 
World 
~800 
KB 
– SWT 
Example 
~1.4 
MB 
• При 
агрессивном 
удалении 
«ненужных» 
методов 
и 
их 
метаинформации
JetPerfect 
(2001) 
Не 
такой 
уж 
perfect: 
– не 
соответствует 
Java 
SE 
спецификации 
– труден 
в 
использовании 
– приложения 
«не 
всегда 
работают» 
– возникающие 
(у 
конечного 
пользователя) 
ошибки 
не 
диагностируемы
Java 
Runxme 
Slim-­‐Down
Java 
Runxme 
Slim-­‐Down 
(2007) 
• Глобально 
оптимизированный 
исполняемый 
файл 
– «нужные» 
классы 
приложения 
и 
Java 
платформы 
оптимизируются 
совместно 
• Оставшиеся 
классы 
– не 
удаляются 
– остается 
возможность 
загружать 
их 
через 
JIT
Java 
Runxme 
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 
Runxme 
Slim-­‐Down 
• Пользователю 
предоставляются: 
– результаты 
анализа 
c 
возможностью 
исключить 
неиспользуемые 
компоненты
Java 
Runxme 
Slim-­‐Down 
• Исключенные 
компоненты: 
– помещаются 
на 
веб-­‐сервер 
(доступны 
приложению) 
– загружаются 
VM 
по 
требованию 
• Соответствует 
Java 
SE 
спецификации!
Результаты
On 
GUI 
toolkits 
• Экономия 
в 
размере 
незначительна, 
если 
используется 
Java2D, 
AWT/Swing 
• Что 
делать?
On 
GUI 
toolkits 
• Экономия 
в 
размере 
незначительна, 
если 
используется 
Java2D, 
AWT/Swing 
• Что 
делать? 
• Java 
Core 
+ 
alternaxve 
GUI 
toolkit
Java 
Core 
+ 
alternaxve 
GUI
Java 
Core 
+ 
alternaxve 
GUI 
Фрагментация 
Java
Java 
Core 
+ 
alternaxve 
GUI 
• SWT/JFace 
• eSWT 
• Java 
OpenGL 
• JavaFX 
– уже 
входит 
в 
платформу!
JavaFX 
Packager 
vs. 
Runxme 
Slim-­‐Down 
JavaFX 
naxve 
Packager 
Java 
Runxme 
Slim-­‐Down 
Ensemble 
Demo 
34 
MB 
19 
MB 
BrickBreaker 
30 
MB 
13 
MB 
Замечание: 
размеры 
дистрибутивов 
для 
Windows 
для 
Java 
7, 
JavaFX 
зависел 
от 
AWT 
в 
Java 
7
Java 
Runxme 
Slim-­‐Down: 
уроки 
• Компонентная 
модель 
JRE 
для 
уменьшения 
приватного 
Java 
Runxme 
– жизнеспособна 
– работает 
• Проверено 
временем
Проект 
Jigsaw
Проект 
Jigsaw 
• Java 
Module 
System 
h.p://openjdk.java.net/projects/jigsaw 
• Модуляризация 
JRE 
– разбиение 
на 
компоненты 
– устранение 
лишних 
зависимостей 
– перевод 
на 
Module 
System
Прототип 
Java 
Module 
System 
• Доступен 
по 
h.p://jdk8.java.net/jigsaw/ 
• module-info.java 
– описывает 
зависимости 
модуля 
(JLS, 
JVM) 
• .jmod 
-­‐ 
бинарный 
формат 
модуля 
• jpkg 
-­‐ 
инструмент 
для 
упаковки 
модуля 
– использует 
pack200, 
7z, 
bzip 
• javac, jmod 
– 
статическое 
управление 
зависимостями 
• java –m ... 
-­‐ 
модульный 
режим 
запуска
Jigsaw: 
модуляризация 
JRE 
• Планы: 
J 
Ä 
Java8 
Ä 
• Почему 
так 
долго? 
-­‐ 
объективные 
причины
Jigsaw: 
трудности 
перевода
Jigsaw: 
трудности 
перевода
Jigsaw: 
проблемы 
прототипа 
• Многие 
зависимости 
убраны, 
но 
многие 
еще 
осталось 
– процесс 
оказался 
очень 
трудоёмкий 
• Проблемы 
с 
обратной 
совместимостью 
– getClassLoader() == null 
– Class.forName() 
и 
правила 
видимости 
– classloader 
delegaxon
Jigsaw: 
текущий 
статус 
• Определены 
новые 
требования 
– обратная 
совместимость 
– 
«cвященная 
корова» 
• Платформенные 
модули 
отличаются 
от 
пользовательских 
– нельзя 
подключать 
два 
платформенных 
модуля 
с 
одной 
функциональностью 
разных 
версий 
– для 
пользовательских 
модулей 
-­‐ 
можно
• Не 
Jigsaw: 
текущий 
статус 
будет 
клона 
Maven, 
Ivy, 
Gradle 
• Поддержка 
нативных 
пакетных 
мэнеджеров 
– Java 
модуль 
можно 
поставить 
через 
rpm, 
yum, 
etc. 
– без 
поддержки 
Mac, 
Windows 
– для 
Mac, 
Windows 
будет 
инструмент 
паковки 
в 
нативный 
инсталлятор 
• AOT 
компиляция 
Java 
модулей 
– если 
будет 
найден 
proof 
of 
concept
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.transacxon 
javax.management 
java.nio 
javax.xml 
javax.naming 
java.uxl 
org.w3c.dom 
javax.script 
java.net 
org.xml.sax 
javax.security 
java.security 
javax.sql 
javax.crypto 
javax.xml.crypto 
java.text 
org.ie¯.jgss
Compact 
Profiles: 
инструменты 
• jdeps 
– 
инструмент 
статического 
анализа 
зависимостей 
приложения 
• javac –profile 
– 
предупреждает 
о 
зависимостях 
вне 
указанного 
профиля 
• jrecreate 
– 
создает 
нужный 
компактный 
профиль 
– Есть 
только 
в 
Java 
SE 
Embedded!
Compact 
Profiles: 
размеры 
• Compact1: 
11MB 
• Compact2: 
15MB 
• Compact3: 
21MB 
• Full 
JRE: 
49MB 
Замечание: 
размеры 
на 
диске 
(ROM)
JEP-­‐178 
(Staxcally-­‐Linked 
JNI 
libraries) 
• Распространение 
без 
динамических 
библиотек 
– реализация 
naxve-­‐методов 
линкуется 
к 
JVM 
– 
единый 
исполняемый 
файл 
• Преодоление 
существующих 
барьеров 
– требования 
Apple 
AppStore
Заключение 
• Компонентная 
модель 
JRE 
– жизнеспособна 
• Перевод 
JRE 
на 
модульную 
систему 
– статический 
импорт 
(без 
лишних 
зависимостей) 
– требует 
времени 
• Путь 
Java 
to 
Mobile 
– модульность: 
Java 
core 
+ 
JavaFX 
– AOT 
компиляция 
+ 
JEP-­‐178
Вопросы и ответы 
Никита Липский, 
Excelsior 
nlipsky@excelsior-usa.com 
twitter: @pjBooms

Contenu connexe

Tendances

Верификация Java байткода: когда, как, а может отключить?
Верификация Java байткода: когда, как, а может отключить?Верификация Java байткода: когда, как, а может отключить?
Верификация Java байткода: когда, как, а может отключить?
Nikita Lipsky
 
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest
 
Tech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция JavaTech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на Java
Alex Chistyakov
 
Быстрое расширение Robot Framework под свои нужды с использованием Python
Быстрое расширение Robot Framework под свои нужды с использованием PythonБыстрое расширение Robot Framework под свои нужды с использованием Python
Быстрое расширение Robot Framework под свои нужды с использованием Python
automated-testing.info
 
Java весна 2014 лекция 1
Java весна 2014 лекция 1Java весна 2014 лекция 1
Java весна 2014 лекция 1
Technopark
 
Java Platform Performance BoF
Java Platform Performance BoFJava Platform Performance BoF
Java Platform Performance BoF
Dmitry Buzdin
 

Tendances (20)

Java худеет. Спроси меня как.
Java худеет. Спроси меня как.Java худеет. Спроси меня как.
Java худеет. Спроси меня как.
 
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 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended version
 
What to expect from Java 9
What to expect from Java 9What to expect from Java 9
What to expect from Java 9
 
Java 9 - Back to the Future
Java 9 - Back to the FutureJava 9 - Back to the Future
Java 9 - Back to the Future
 
Верификация Java байткода: когда, как, а может отключить?
Верификация Java байткода: когда, как, а может отключить?Верификация Java байткода: когда, как, а может отключить?
Верификация Java байткода: когда, как, а может отключить?
 
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
 
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
 
Tech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция JavaTech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция Java
 
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 днейГотовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на Java
 
UICov - инструмент анализа покрытия UI-тестами
UICov - инструмент анализа покрытия UI-тестамиUICov - инструмент анализа покрытия UI-тестами
UICov - инструмент анализа покрытия UI-тестами
 
DevOps guide for awesome quality assurance
DevOps guide for awesome quality assuranceDevOps guide for awesome quality assurance
DevOps guide for awesome quality assurance
 
Test driven development in net
Test driven development in netTest driven development in net
Test driven development in net
 
Continuousdelivery
ContinuousdeliveryContinuousdelivery
Continuousdelivery
 
Akka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный кодAkka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный код
 
Быстрое расширение Robot Framework под свои нужды с использованием Python
Быстрое расширение Robot Framework под свои нужды с использованием PythonБыстрое расширение Robot Framework под свои нужды с использованием Python
Быстрое расширение Robot Framework под свои нужды с использованием Python
 
Основы и нюансы параллельного тестрования
Основы и нюансы параллельного тестрованияОсновы и нюансы параллельного тестрования
Основы и нюансы параллельного тестрования
 
Java весна 2014 лекция 1
Java весна 2014 лекция 1Java весна 2014 лекция 1
Java весна 2014 лекция 1
 
Java Platform Performance BoF
Java Platform Performance BoFJava Platform Performance BoF
Java Platform Performance BoF
 

En vedette

Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
metaform
 
Массивы в Java
Массивы в JavaМассивы в Java
Массивы в Java
metaform
 

En vedette (19)

Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
Секреты сборки мусора в Java
Секреты сборки мусора в JavaСекреты сборки мусора в Java
Секреты сборки мусора в Java
 
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 Core. Lecture# 1. Intro
Java Core. Lecture# 1. IntroJava Core. Lecture# 1. Intro
Java Core. Lecture# 1. Intro
 
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
 
Как улучшить результаты, используя софт для рекрутинга
 Как улучшить результаты, используя софт для рекрутинга Как улучшить результаты, используя софт для рекрутинга
Как улучшить результаты, используя софт для рекрутинга
 
урок ц о
урок ц оурок ц о
урок ц о
 
кобзар
кобзаркобзар
кобзар
 
Expert Java Day: Java concurrency
Expert Java Day: Java concurrencyExpert Java Day: Java concurrency
Expert Java Day: Java concurrency
 
JavaFX Real-World Apps
JavaFX Real-World AppsJavaFX Real-World Apps
JavaFX Real-World Apps
 
JavaFX Layout Secrets with Amy Fowler
JavaFX Layout Secrets with Amy FowlerJavaFX Layout Secrets with Amy Fowler
JavaFX Layout Secrets with Amy Fowler
 
Массивы в 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
 
8 True Stories about JavaFX
8 True Stories about JavaFX8 True Stories about JavaFX
8 True Stories about JavaFX
 
JavaFX 8 - GUI by Illusion
JavaFX 8 - GUI by IllusionJavaFX 8 - GUI by Illusion
JavaFX 8 - GUI by Illusion
 
JavaFX Presentation
JavaFX PresentationJavaFX Presentation
JavaFX Presentation
 
Java: вчера, сегодня, завтра
Java: вчера, сегодня, завтраJava: вчера, сегодня, завтра
Java: вчера, сегодня, завтра
 
Sergii Tsypanov: "Tricky enterprise"
Sergii Tsypanov: "Tricky enterprise"Sergii Tsypanov: "Tricky enterprise"
Sergii Tsypanov: "Tricky enterprise"
 
TEDx Manchester: AI & The Future of Work
TEDx Manchester: AI & The Future of WorkTEDx Manchester: AI & The Future of Work
TEDx Manchester: AI & The Future of Work
 

Similaire à Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения без зависимостей.

развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)
guest40e031
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Servers
rit2010
 
Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?
buranLcme
 
Практический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQLПрактический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQL
Alex Chistyakov
 
Dz Java Hi Load 0.4
Dz Java Hi Load 0.4Dz Java Hi Load 0.4
Dz Java Hi Load 0.4
HighLoad2009
 
Что такое Java? Кто такой Java разработчик?
Что такое Java? Кто такой Java разработчик?Что такое Java? Кто такой Java разработчик?
Что такое Java? Кто такой Java разработчик?
GetITAbroad
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013
Serguei Gitinsky
 
Загрузчики классов в Java - коллекция граблей
Загрузчики классов в Java - коллекция граблейЗагрузчики классов в Java - коллекция граблей
Загрузчики классов в Java - коллекция граблей
Anton Arhipov
 
Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на Ruby
Alex Chistyakov
 

Similaire à Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения без зависимостей. (20)

развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Servers
 
Java 9 - кратко о новом
Java 9 -  кратко о новомJava 9 -  кратко о новом
Java 9 - кратко о новом
 
Доклады с прошедшей JiraMania: про обновления, зависимости и дедлоки
Доклады с прошедшей JiraMania: про обновления, зависимости и дедлокиДоклады с прошедшей JiraMania: про обновления, зависимости и дедлоки
Доклады с прошедшей JiraMania: про обновления, зависимости и дедлоки
 
Занимательные истории из жизни технической поддержки JVM
Занимательные истории из жизни технической поддержки JVMЗанимательные истории из жизни технической поддержки JVM
Занимательные истории из жизни технической поддержки JVM
 
A.pleshkov
A.pleshkovA.pleshkov
A.pleshkov
 
Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?
 
Практический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQLПрактический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQL
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчика
 
Dz Java Hi Load 0.4
Dz Java Hi Load 0.4Dz Java Hi Load 0.4
Dz Java Hi Load 0.4
 
Что такое Java? Кто такой Java разработчик?
Что такое Java? Кто такой Java разработчик?Что такое Java? Кто такой Java разработчик?
Что такое Java? Кто такой Java разработчик?
 
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1
 
Загрузчики классов в Java - коллекция граблей
Загрузчики классов в Java - коллекция граблейЗагрузчики классов в Java - коллекция граблей
Загрузчики классов в Java - коллекция граблей
 
Lesson 01
Lesson 01Lesson 01
Lesson 01
 
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)
 
Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на Ruby
 
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?Веб 3.0. Есть ли будущее у Java в RIA и Mobile?
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?
 
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
 

Plus de Nikita Lipsky

Plus de Nikita Lipsky (9)

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
 
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
 
Java Restart with WebFX
Java Restart with WebFX Java Restart with WebFX
Java Restart with WebFX
 
Неумолимая близость десктопа, веба и мобайла
Неумолимая близость десктопа, веба и мобайлаНеумолимая близость десктопа, веба и мобайла
Неумолимая близость десктопа, веба и мобайла
 
История одной JVM в картинках
История одной JVM в картинкахИстория одной JVM в картинках
История одной JVM в картинках
 

Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения без зависимостей.

  • 1. Java худеет. Спроси меня как. Никита Липский twi.er: @pjBooms Excelsior LLC
  • 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 -­‐ неприемлемо
  • 5. Распространение Java приложений Недостающая возможность: Private JRE …
  • 6. Распространение Java приложений Недостающая возможность: Private JRE маленького размера
  • 7. Распространение Java приложений Недостающая возможность: Private JRE маленького размера, позволит • меньше загружать из интернета • сократить занимаемое на диске место • улучшить User eXperience
  • 8. Кто знает про Excelsior JET?
  • 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. Решение: удалить ненужные классы! Вопрос: а какие классы -­‐ ненужные?
  • 16. “Ненужные” классы Класс не нужен, если он не является нужным
  • 18. Нужные классы • java.lang.Object – нужен
  • 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. И продолжает что-­‐то качать …
  • 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)
  • 40. Глобальный анализатор Application Java SE API Entry points - used - not used
  • 42. Reflecxon & JNI? • Пробный запуск (off-­‐line profiling) • Дополняет множества – точек входа – LiveClasses – VirtCallSites
  • 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. • анализатор определяет какие компоненты “нужны” – содержат достижимые методы
  • 48. Глобальный анализатор Application Java SE API Entry points - used - not used - component’s boundary
  • 49. Java Runxme Slim-­‐Down • Пользователю предоставляются: – результаты анализа c возможностью исключить неиспользуемые компоненты
  • 50. Java Runxme Slim-­‐Down • Исключенные компоненты: – помещаются на веб-­‐сервер (доступны приложению) – загружаются VM по требованию • Соответствует Java SE спецификации!
  • 52. On GUI toolkits • Экономия в размере незначительна, если используется Java2D, AWT/Swing • Что делать?
  • 53. On GUI toolkits • Экономия в размере незначительна, если используется Java2D, AWT/Swing • Что делать? • Java Core + alternaxve GUI toolkit
  • 54. Java Core + alternaxve GUI
  • 55. Java Core + alternaxve GUI Фрагментация Java
  • 56. Java Core + alternaxve GUI • SWT/JFace • eSWT • Java OpenGL • JavaFX – уже входит в платформу!
  • 57. JavaFX Packager vs. Runxme Slim-­‐Down JavaFX naxve Packager Java Runxme Slim-­‐Down Ensemble Demo 34 MB 19 MB BrickBreaker 30 MB 13 MB Замечание: размеры дистрибутивов для Windows для Java 7, JavaFX зависел от AWT в Java 7
  • 58. Java Runxme Slim-­‐Down: уроки • Компонентная модель JRE для уменьшения приватного Java Runxme – жизнеспособна – работает • Проверено временем
  • 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 ... -­‐ модульный режим запуска
  • 62. Jigsaw: модуляризация JRE • Планы: J Ä Java8 Ä • Почему так долго? -­‐ объективные причины
  • 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
  • 68. 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.transacxon javax.management java.nio javax.xml javax.naming java.uxl org.w3c.dom javax.script java.net org.xml.sax javax.security java.security javax.sql javax.crypto javax.xml.crypto java.text org.ie¯.jgss
  • 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