SlideShare une entreprise Scribd logo
1  sur  48
Télécharger pour lire hors ligne
Excelsior JET в действии

Никита Липский
Павел Павлов
Excelsior
История
Кто знает про Excelsior JET?
Про Excelsior JET?
• Полная реализация Java SE
– первый релиз 2000 год
– c 2005 года cертифицирована как Java Compatible

• AOT compiler + Java Runtime
– смешанная компиляция: AOT + JIT
– поддержка нестандартных загрузчиков классов в
AOT режиме (для Eclipse RCP, Tomcat)

• Toolkit
– Startup Optimizer
– Deployment
Кто знает про Excelsior JET?

Кто знает про Excelsior JET?
Для чего Excelsior JET?
• Ускорение приложений без переписывания
• Защита кода от декомпиляции

• Распространение приложений без
зависимостей в компактном и привычном
для конечного пользователя виде
Мифы вокруг статической
компиляции Java
Миф 1.
Java - динамическая
• Reflection

• Динамическая загрузка

Статическая компиляция невозможна?
Миф 2. Машинный код –
убийца WORA
WORA: Write Once Run Anywhere
(пиши раз, исполняй везде)

!=
BORA: Build Once?
(собирай раз??? …)
Миф 3. JIT быстрее
Динамический профиль исполнения
РУЛИТ!
Миф 4. AOT быстрее

Машинный код со старта
РУЛИТ!
Ключевые возможности
Excelsior JET
Защита приложений
• Декомпиляция настолько же сложна как для программ,
написанных на C/C++
• На выходе реальный машинный код без символов (невозможно
понять даже структуру приложения)
• Нет 1-1 соответствия между оригинальным байт-кодом и
результирующим машинным кодом
• После оптимизации приложения с использованием открытой
подстановки и других оптимизаций, результирующий код далек
от оригинального
• Есть возможность закриптовать ресурсы и reflection программы
(не видны простым просмотром)
Ускорение приложений
Время старта приложения
Холодный старт vs
теплый
Во второй раз приложение стартует
значительно быстрее, чем в первый
– Загрузка кода и данных приложения с
диска
– Загрузка системных и сторонних
динамических библиотек (dll, so)
AOT быстрее?
• Машинный код “толще” Java bytecode

• Загрузка кода с диска занимает
больше времени, чем его начальное
исполнение
AOT быстрее!
• Код исполняемый на старте – в начало
«экзешника»
• Можно предзагружать стартовый
сегмент последовательным чтением
Пользовательские
загрузчики классов
Пользовательские
загрузчики классов
• Если AOT компилятор знает логику загрузки
определенного загрузчика, он может классы,
загружаемые этим загрузчиком компилировать до
исполнения

• Eclipse RCP
• Tomcat
Excelsior JET Global Optimizer
• Глобально оптимизированный
исполняемый файл
– «нужные» классы приложения и Java
платформы оптимизируются совместно

• Оставшиеся классы
– не удаляются
– остается возможность загружать их через
JIT
Java Runtime Slim-Down
• Java SE API делится на
компоненты:
– Kernel, XML, SQL, CORBA, AWT/Java2D,
Swing, etc.

• анализатор определяет какие
компоненты “нужны”
– содержат достижимые методы
Глобальный анализатор
Java SE API
Application

Entry points
- used
- not used
- component’s boundary
Java Runtime Slim-Down
• Пользователю предоставляются:
– результаты анализа c возможностью
исключить неиспользуемые компоненты
Java Runtime Slim-Down
• Исключенные компоненты:
– помещаются на веб-сервер (доступны
приложению)
– загружаются VM по требованию

• Соответствует Java SE
спецификации!
Результаты
Внутренняя архитектура
Excelsior JET
Компоненты Excelsior
JET JVM
• Оптимизирующий AOT компилятор
– Высокоуровненвый оптимизатор (анализатор
типов, утечек (escape), открытые подстановки и
т.п.)
– Глобальный оптимизатор
– SSA оптимизатор
– Низкоуровневый оптимизатор

• Excelsior JET Runtime
–
–
–
–

Memory Manager
GC
JIT
Прочее (JNI, Refection, InDy, файлуха, и.т.п.)
Оптимизации
• Виды оптимизаций
–
–
–
–
–
–
–
–
–
–

Протяжка констант
Удаление избыточного кода
Удаление общих подвыражений
Открытая подстановка
Специализация методов
Развертывание циклов
Версионирование циклов
Вынос инвариантов
Удаление хвостовой рекурсии
Девиртуализация вызовов

– Аллокация объектов на стэке и
их взрыв
– Удаление проверок времени
исполнения
– Удаление избыточной
синхронизации
– Оптимальная выборка кода и
свертка шаблонов
– Планировка инструкций
– Оптимальное распределение
регистров
Анализ потока данных
• Протяжка констант
• Удаление общих подвыражений
• Оптимальное распределение
регистров.
• И многое другое
Java – ООП
• Много методов

• Методы маленькие (get/set)
• Методы по умолчанию
ВИРТУАЛЬНЫЕ
Девиртулизация
вызовов
• Предусловие дальнейшей открытой
подстановки (inline)
• Анализ иерархии классов
– метод не перегружается – невиртульный
• Типовый анализ
– new T().foo(); //вызов foo() невиртульный
Аллокация объектов
на стэке
• Все Java объекты создаются в динамической
памяти – Java heap (куча)
• Большинство объектов временные
• Хочется их размещать на стэке метода

• Escape анализ (анализ утечек) –
определяет утекает ли объект в
разделяемую память.
Глобальный анализ
• Типовый и Escape анализы боятся
вызовов, особенно виртуальных.
• Глобальный анализ – анализирует все
методы программы, в частности
уточняя типовый и escapе анализы.
Анализы и оптимизации
• Часто бывают довольно сложными
• Требуют итеративного пересчета
• Глобальный анализ зависит от ВСЕЙ
программы.
Анализы и оптимизации
• Часто бывают довольно сложными
• Требуют итеративного пересчета
• Глобальный анализ зависит от ВСЕЙ
программы.

Все ли это может
себе позволить JIT?
Динамические
оптимизации
Может ли статический компилятор
использовать динамический профиль
исполнения?
Горячий код vs теплый
• А что будет, если у приложения нет
ярко выраженного горячего кода?
• Долгий прогрев, результаты прогрева
не используются при дальнейших
стартах приложения
Excelsior JET Runtime
Memory Manager
• Не непрерывная структура хипа (блок – 16 КB)
– Позволяет не только брать память, но и
отдавать
• Специализированные аллокаторы
– Маленькие объекты
– Средние объекты
– Большие объекты
– Ключевые объекты (граф объектов умирает
одновременно, в большинстве случаев)
GC
• Адаптивная сборка мусора
– GC старается жить в том пространстве свободной памяти,
что есть (maxheap – это только барьер за который нельзя
заходить)
– Может не только потреблять память, но и отдавать, если
память не нужна
– Пытается ужиться с другими процессами запущенными на
машине
– Наблюдает не только за Java кучей, но и за потреблением
памяти в нативном коде
– Можно выставить gc ratio (хинт GC, говорящий сколько
может потратить GC времени в сравнении с самим
приложением)
Parallel Concurrent Incremental
Mark Compact GC
• Алгоритм из класса трассирующих.
• Parallel – исполняется на нескольких процессорах во
время остановки мира
• Concurrent – делает часть работы во время исполнения
– foreground (потоки приложения занимаются сборкой мусора)
– background (в фоновом потоке)

• Incremental – не обходит все объекты каждый цикл
• Mark-Compact – решает компактизировать ли кучу
– делает это в «плановом порядке», а не «когда уже приперло»
– не делает перемещение и настроку части кучи каждый раз
– фрагментация кучи < 5% (чаще всего)

•
JIT + AOT модель исполнения
• Reflective shield: незарезолванные ссылки во время
AOT компиляции превращаются в специальный код
(рефлективные стабы), который может резолваться
во время исполнения.
• JIT и AOT порождают одни и те же ран-тайм
структуры.
• JIT и AOT имеют общий код
Планы
• Java 7 и Linux AMD64 (декабрь 2013)
• Mac OSX (май 2014)
• Java 8, Linux ARM, compact profiles
• iOS
• Android
Вопросы и
ответы
Никита Липский,
Павел Павлов
Excelsior
Компиляторный Hard Core

Contenu connexe

Tendances

CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на Java
Alex Chistyakov
 
Java Platform Performance BoF
Java Platform Performance BoFJava Platform Performance BoF
Java Platform Performance BoF
Dmitry Buzdin
 
Практический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQLПрактический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQL
Alex Chistyakov
 
Tech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция JavaTech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU
 
Java весна 2014 лекция 1
Java весна 2014 лекция 1Java весна 2014 лекция 1
Java весна 2014 лекция 1
Technopark
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Servers
rit2010
 
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
DevDay
 

Tendances (20)

Java 9 модули
Java 9 модулиJava 9 модули
Java 9 модули
 
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. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended version
 
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
 
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на Java
 
Java Platform Performance BoF
Java Platform Performance BoFJava Platform Performance BoF
Java Platform Performance BoF
 
Практический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQLПрактический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQL
 
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 днейГотовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
 
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
 
Test driven development in net
Test driven development in netTest driven development in net
Test driven development in net
 
Java весна 2014 лекция 1
Java весна 2014 лекция 1Java весна 2014 лекция 1
Java весна 2014 лекция 1
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Servers
 
Автоматизация тестирования многопоточности
Автоматизация тестирования многопоточностиАвтоматизация тестирования многопоточности
Автоматизация тестирования многопоточности
 
Erlang for Yandex
Erlang for YandexErlang for Yandex
Erlang for Yandex
 
UICov - инструмент анализа покрытия UI-тестами
UICov - инструмент анализа покрытия UI-тестамиUICov - инструмент анализа покрытия UI-тестами
UICov - инструмент анализа покрытия UI-тестами
 
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.)
 
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
 

En vedette

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

En vedette (13)

Массивы в Java
Массивы в JavaМассивы в Java
Массивы в Java
 
кобзар
кобзаркобзар
кобзар
 
Как улучшить результаты, используя софт для рекрутинга
 Как улучшить результаты, используя софт для рекрутинга Как улучшить результаты, используя софт для рекрутинга
Как улучшить результаты, используя софт для рекрутинга
 
урок ц о
урок ц оурок ц о
урок ц о
 
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
 
Секреты сборки мусора в Java
Секреты сборки мусора в JavaСекреты сборки мусора в Java
Секреты сборки мусора в Java
 
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
 
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 à Excelsior JET в действии

AOT-компиляция Java
AOT-компиляция JavaAOT-компиляция Java
AOT-компиляция Java
Tech Talks @NSU
 
Dz Java Hi Load 0.4
Dz Java Hi Load 0.4Dz Java Hi Load 0.4
Dz Java Hi Load 0.4
HighLoad2009
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels
Nikolay Samokhvalov
 
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Ontico
 
Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12
Alex Tutubalin
 
20100314 virtualization igotti_lecture06
20100314 virtualization igotti_lecture0620100314 virtualization igotti_lecture06
20100314 virtualization igotti_lecture06
Computer Science Club
 
Н. Иготти. Виртуализация и виртуальные машины. Лекция 02
Н. Иготти. Виртуализация и виртуальные машины. Лекция 02Н. Иготти. Виртуализация и виртуальные машины. Лекция 02
Н. Иготти. Виртуализация и виртуальные машины. Лекция 02
Computer Science Club
 

Similaire à Excelsior JET в действии (20)

AOT-компиляция Java
AOT-компиляция JavaAOT-компиляция Java
AOT-компиляция Java
 
Dz Java Hi Load 0.4
Dz Java Hi Load 0.4Dz Java Hi Load 0.4
Dz Java Hi Load 0.4
 
Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels
 
Введение в Python и Django
Введение в Python и DjangoВведение в Python и Django
Введение в Python и Django
 
Использование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестированияИспользование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестирования
 
Lab5
Lab5Lab5
Lab5
 
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
 
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
 
Облако в Badoo год спустя
Облако в Badoo год спустяОблако в Badoo год спустя
Облако в Badoo год спустя
 
Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12
 
20100314 virtualization igotti_lecture06
20100314 virtualization igotti_lecture0620100314 virtualization igotti_lecture06
20100314 virtualization igotti_lecture06
 
Внедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движокВнедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движок
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
 
Н. Иготти. Виртуализация и виртуальные машины. Лекция 02
Н. Иготти. Виртуализация и виртуальные машины. Лекция 02Н. Иготти. Виртуализация и виртуальные машины. Лекция 02
Н. Иготти. Виртуализация и виртуальные машины. Лекция 02
 
Компьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingКомпьютерная графика. Введение в Processing
Компьютерная графика. Введение в Processing
 
TMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeTMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: Genode
 
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в java
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»
 

Plus de Nikita Lipsky

Верификация Java байткода: когда, как, а может отключить?
Верификация Java байткода: когда, как, а может отключить?Верификация Java байткода: когда, как, а может отключить?
Верификация Java байткода: когда, как, а может отключить?
Nikita Lipsky
 

Plus de Nikita Lipsky (13)

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

Excelsior JET в действии

  • 1. Excelsior JET в действии Никита Липский Павел Павлов Excelsior
  • 3. Кто знает про Excelsior JET?
  • 4. Про Excelsior JET? • Полная реализация Java SE – первый релиз 2000 год – c 2005 года cертифицирована как Java Compatible • AOT compiler + Java Runtime – смешанная компиляция: AOT + JIT – поддержка нестандартных загрузчиков классов в AOT режиме (для Eclipse RCP, Tomcat) • Toolkit – Startup Optimizer – Deployment
  • 5.
  • 6. Кто знает про Excelsior JET? Кто знает про Excelsior JET?
  • 7. Для чего Excelsior JET? • Ускорение приложений без переписывания • Защита кода от декомпиляции • Распространение приложений без зависимостей в компактном и привычном для конечного пользователя виде
  • 9. Миф 1. Java - динамическая • Reflection • Динамическая загрузка Статическая компиляция невозможна?
  • 10. Миф 2. Машинный код – убийца WORA WORA: Write Once Run Anywhere (пиши раз, исполняй везде) != BORA: Build Once? (собирай раз??? …)
  • 11. Миф 3. JIT быстрее Динамический профиль исполнения РУЛИТ!
  • 12. Миф 4. AOT быстрее Машинный код со старта РУЛИТ!
  • 14. Защита приложений • Декомпиляция настолько же сложна как для программ, написанных на C/C++ • На выходе реальный машинный код без символов (невозможно понять даже структуру приложения) • Нет 1-1 соответствия между оригинальным байт-кодом и результирующим машинным кодом • После оптимизации приложения с использованием открытой подстановки и других оптимизаций, результирующий код далек от оригинального • Есть возможность закриптовать ресурсы и reflection программы (не видны простым просмотром)
  • 17. Холодный старт vs теплый Во второй раз приложение стартует значительно быстрее, чем в первый – Загрузка кода и данных приложения с диска – Загрузка системных и сторонних динамических библиотек (dll, so)
  • 18. AOT быстрее? • Машинный код “толще” Java bytecode • Загрузка кода с диска занимает больше времени, чем его начальное исполнение
  • 19. AOT быстрее! • Код исполняемый на старте – в начало «экзешника» • Можно предзагружать стартовый сегмент последовательным чтением
  • 20.
  • 22. Пользовательские загрузчики классов • Если AOT компилятор знает логику загрузки определенного загрузчика, он может классы, загружаемые этим загрузчиком компилировать до исполнения • Eclipse RCP • Tomcat
  • 23. Excelsior JET Global Optimizer • Глобально оптимизированный исполняемый файл – «нужные» классы приложения и Java платформы оптимизируются совместно • Оставшиеся классы – не удаляются – остается возможность загружать их через JIT
  • 24. Java Runtime Slim-Down • Java SE API делится на компоненты: – Kernel, XML, SQL, CORBA, AWT/Java2D, Swing, etc. • анализатор определяет какие компоненты “нужны” – содержат достижимые методы
  • 25. Глобальный анализатор Java SE API Application Entry points - used - not used - component’s boundary
  • 26. Java Runtime Slim-Down • Пользователю предоставляются: – результаты анализа c возможностью исключить неиспользуемые компоненты
  • 27. Java Runtime Slim-Down • Исключенные компоненты: – помещаются на веб-сервер (доступны приложению) – загружаются VM по требованию • Соответствует Java SE спецификации!
  • 30. Компоненты Excelsior JET JVM • Оптимизирующий AOT компилятор – Высокоуровненвый оптимизатор (анализатор типов, утечек (escape), открытые подстановки и т.п.) – Глобальный оптимизатор – SSA оптимизатор – Низкоуровневый оптимизатор • Excelsior JET Runtime – – – – Memory Manager GC JIT Прочее (JNI, Refection, InDy, файлуха, и.т.п.)
  • 31. Оптимизации • Виды оптимизаций – – – – – – – – – – Протяжка констант Удаление избыточного кода Удаление общих подвыражений Открытая подстановка Специализация методов Развертывание циклов Версионирование циклов Вынос инвариантов Удаление хвостовой рекурсии Девиртуализация вызовов – Аллокация объектов на стэке и их взрыв – Удаление проверок времени исполнения – Удаление избыточной синхронизации – Оптимальная выборка кода и свертка шаблонов – Планировка инструкций – Оптимальное распределение регистров
  • 32. Анализ потока данных • Протяжка констант • Удаление общих подвыражений • Оптимальное распределение регистров. • И многое другое
  • 33. Java – ООП • Много методов • Методы маленькие (get/set) • Методы по умолчанию ВИРТУАЛЬНЫЕ
  • 34. Девиртулизация вызовов • Предусловие дальнейшей открытой подстановки (inline) • Анализ иерархии классов – метод не перегружается – невиртульный • Типовый анализ – new T().foo(); //вызов foo() невиртульный
  • 35. Аллокация объектов на стэке • Все Java объекты создаются в динамической памяти – Java heap (куча) • Большинство объектов временные • Хочется их размещать на стэке метода • Escape анализ (анализ утечек) – определяет утекает ли объект в разделяемую память.
  • 36. Глобальный анализ • Типовый и Escape анализы боятся вызовов, особенно виртуальных. • Глобальный анализ – анализирует все методы программы, в частности уточняя типовый и escapе анализы.
  • 37. Анализы и оптимизации • Часто бывают довольно сложными • Требуют итеративного пересчета • Глобальный анализ зависит от ВСЕЙ программы.
  • 38. Анализы и оптимизации • Часто бывают довольно сложными • Требуют итеративного пересчета • Глобальный анализ зависит от ВСЕЙ программы. Все ли это может себе позволить JIT?
  • 39. Динамические оптимизации Может ли статический компилятор использовать динамический профиль исполнения?
  • 40. Горячий код vs теплый • А что будет, если у приложения нет ярко выраженного горячего кода? • Долгий прогрев, результаты прогрева не используются при дальнейших стартах приложения
  • 42. Memory Manager • Не непрерывная структура хипа (блок – 16 КB) – Позволяет не только брать память, но и отдавать • Специализированные аллокаторы – Маленькие объекты – Средние объекты – Большие объекты – Ключевые объекты (граф объектов умирает одновременно, в большинстве случаев)
  • 43. GC • Адаптивная сборка мусора – GC старается жить в том пространстве свободной памяти, что есть (maxheap – это только барьер за который нельзя заходить) – Может не только потреблять память, но и отдавать, если память не нужна – Пытается ужиться с другими процессами запущенными на машине – Наблюдает не только за Java кучей, но и за потреблением памяти в нативном коде – Можно выставить gc ratio (хинт GC, говорящий сколько может потратить GC времени в сравнении с самим приложением)
  • 44. Parallel Concurrent Incremental Mark Compact GC • Алгоритм из класса трассирующих. • Parallel – исполняется на нескольких процессорах во время остановки мира • Concurrent – делает часть работы во время исполнения – foreground (потоки приложения занимаются сборкой мусора) – background (в фоновом потоке) • Incremental – не обходит все объекты каждый цикл • Mark-Compact – решает компактизировать ли кучу – делает это в «плановом порядке», а не «когда уже приперло» – не делает перемещение и настроку части кучи каждый раз – фрагментация кучи < 5% (чаще всего) •
  • 45. JIT + AOT модель исполнения • Reflective shield: незарезолванные ссылки во время AOT компиляции превращаются в специальный код (рефлективные стабы), который может резолваться во время исполнения. • JIT и AOT порождают одни и те же ран-тайм структуры. • JIT и AOT имеют общий код
  • 46. Планы • Java 7 и Linux AMD64 (декабрь 2013) • Mac OSX (май 2014) • Java 8, Linux ARM, compact profiles • iOS • Android