Top Banner
Excelsior JET в действии Никита Липский Павел Павлов Excelsior
48

Excelsior JET в действии

May 27, 2015

Download

Documents

Nikita Lipsky

Презентация со встречи на jug.ru -- http://jugru.timepad.ru/event/83954/
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Excelsior JET в действии

Excelsior JET в действии

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

Павел Павлов

Excelsior

Page 2: Excelsior JET в действии

История

Page 3: Excelsior JET в действии

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

Page 4: 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

Page 5: Excelsior JET в действии
Page 6: Excelsior JET в действии

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

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

Page 7: Excelsior JET в действии

Для чего Excelsior JET?

• Ускорение приложений без переписывания

• Защита кода от декомпиляции

• Распространение приложений без зависимостей в компактном и привычном для конечного пользователя виде

Page 8: Excelsior JET в действии

Мифы вокруг статической

компиляции Java

Page 9: Excelsior JET в действии

Миф 1.

Java - динамическая

• Reflection

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

Статическая компиляция невозможна?

Page 10: Excelsior JET в действии

Миф 2. Машинный код –

убийца WORA

WORA: Write Once Run Anywhere

(пиши раз, исполняй везде)

!= BORA: Build Once?

(собирай раз??? …)

Page 11: Excelsior JET в действии

Миф 3. JIT быстрее

Динамический профиль исполнения

РУЛИТ!

Page 12: Excelsior JET в действии

Миф 4. AOT быстрее

Машинный код со старта

РУЛИТ!

Page 13: Excelsior JET в действии

Ключевые возможности

Excelsior JET

Page 14: Excelsior JET в действии

Защита приложений

• Декомпиляция настолько же сложна как для программ,

написанных на C/C++

• На выходе реальный машинный код без символов (невозможно

понять даже структуру приложения)

• Нет 1-1 соответствия между оригинальным байт-кодом и

результирующим машинным кодом

• После оптимизации приложения с использованием открытой

подстановки и других оптимизаций, результирующий код далек

от оригинального

• Есть возможность закриптовать ресурсы и reflection программы

(не видны простым просмотром)

Page 15: Excelsior JET в действии

Ускорение приложений

Page 16: Excelsior JET в действии

Время старта приложения

Page 17: Excelsior JET в действии

Холодный старт vs

теплый

Во второй раз приложение стартует

значительно быстрее, чем в первый

– Загрузка кода и данных приложения с

диска

– Загрузка системных и сторонних

динамических библиотек (dll, so)

Page 18: Excelsior JET в действии

AOT быстрее?

• Машинный код “толще” Java bytecode

• Загрузка кода с диска занимает

больше времени, чем его начальное

исполнение

Page 19: Excelsior JET в действии

AOT быстрее!

• Код исполняемый на старте – в начало

«экзешника»

• Можно предзагружать стартовый

сегмент последовательным чтением

Page 20: Excelsior JET в действии
Page 21: Excelsior JET в действии

Пользовательские

загрузчики классов

Page 22: Excelsior JET в действии

Пользовательские

загрузчики классов • Если AOT компилятор знает логику загрузки

определенного загрузчика, он может классы,

загружаемые этим загрузчиком компилировать до

исполнения

• Eclipse RCP

• Tomcat

Page 23: Excelsior JET в действии

Excelsior JET Global Optimizer

• Глобально оптимизированный

исполняемый файл – «нужные» классы приложения и Java

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

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

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

JIT

Page 24: Excelsior JET в действии

Java Runtime Slim-Down

• Java SE API делится на

компоненты: – Kernel, XML, SQL, CORBA, AWT/Java2D,

Swing, etc.

• анализатор определяет какие

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

Page 25: Excelsior JET в действии

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

Application

Java SE API

Entry points - used

- not used

- component’s boundary

Page 26: Excelsior JET в действии

Java Runtime Slim-Down

• Пользователю предоставляются: – результаты анализа c возможностью

исключить неиспользуемые компоненты

Page 27: Excelsior JET в действии

Java Runtime Slim-Down

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

приложению)

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

• Соответствует Java SE

спецификации!

Page 29: Excelsior JET в действии

Внутренняя архитектура

Excelsior JET

Page 30: Excelsior JET в действии

• Оптимизирующий AOT компилятор

– Высокоуровненвый оптимизатор (анализатор типов, утечек (escape), открытые подстановки и т.п.)

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

– SSA оптимизатор

– Низкоуровневый оптимизатор

• Excelsior JET Runtime – Memory Manager

– GC

– JIT

– Прочее (JNI, Refection, InDy, файлуха, и.т.п.)

Компоненты Excelsior

JET JVM

Page 31: Excelsior JET в действии

– Протяжка констант

– Удаление избыточного кода

– Удаление общих подвыражений

– Открытая подстановка

– Специализация методов

– Развертывание циклов

– Версионирование циклов

– Вынос инвариантов

– Удаление хвостовой рекурсии

– Девиртуализация вызовов

– Аллокация объектов на стэке и их взрыв

– Удаление проверок времени исполнения

– Удаление избыточной синхронизации

– Оптимальная выборка кода и свертка шаблонов

– Планировка инструкций

– Оптимальное распределение регистров

Оптимизации

• Виды оптимизаций

Page 32: Excelsior JET в действии

Анализ потока данных

• Протяжка констант

• Удаление общих подвыражений

• Оптимальное распределение регистров.

• И многое другое

Page 33: Excelsior JET в действии

Java – ООП

• Много методов

• Методы маленькие (get/set)

• Методы по умолчанию

ВИРТУАЛЬНЫЕ

Page 34: Excelsior JET в действии

Девиртулизация

вызовов

• Предусловие дальнейшей открытой

подстановки (inline)

• Анализ иерархии классов

– метод не перегружается – невиртульный

• Типовый анализ

– new T().foo(); //вызов foo() невиртульный

Page 35: Excelsior JET в действии

Аллокация объектов

на стэке

• Все Java объекты создаются в динамической

памяти – Java heap (куча)

• Большинство объектов временные

• Хочется их размещать на стэке метода

• Escape анализ (анализ утечек) –

определяет утекает ли объект в

разделяемую память.

Page 36: Excelsior JET в действии

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

• Типовый и Escape анализы боятся

вызовов, особенно виртуальных.

• Глобальный анализ – анализирует все

методы программы, в частности

уточняя типовый и escapе анализы.

Page 37: Excelsior JET в действии

Анализы и оптимизации

• Часто бывают довольно сложными

• Требуют итеративного пересчета

• Глобальный анализ зависит от ВСЕЙ

программы.

Page 38: Excelsior JET в действии

Анализы и оптимизации

• Часто бывают довольно сложными

• Требуют итеративного пересчета

• Глобальный анализ зависит от ВСЕЙ

программы.

Все ли это может

себе позволить JIT?

Page 39: Excelsior JET в действии

Динамические

оптимизации

Может ли статический компилятор

использовать динамический профиль

исполнения?

Page 40: Excelsior JET в действии

Горячий код vs теплый

• А что будет, если у приложения нет

ярко выраженного горячего кода?

• Долгий прогрев, результаты прогрева

не используются при дальнейших

стартах приложения

Page 41: Excelsior JET в действии

Excelsior JET Runtime

Page 42: Excelsior JET в действии

Memory Manager

• Не непрерывная структура хипа (блок – 16 КB)

– Позволяет не только брать память, но и

отдавать

• Специализированные аллокаторы

– Маленькие объекты

– Средние объекты

– Большие объекты

– Ключевые объекты (граф объектов умирает

одновременно, в большинстве случаев)

Page 43: Excelsior JET в действии

GC

• Адаптивная сборка мусора – GC старается жить в том пространстве свободной памяти,

что есть (maxheap – это только барьер за который нельзя

заходить)

– Может не только потреблять память, но и отдавать, если

память не нужна

– Пытается ужиться с другими процессами запущенными на

машине

– Наблюдает не только за Java кучей, но и за потреблением

памяти в нативном коде

– Можно выставить gc ratio (хинт GC, говорящий сколько

может потратить GC времени в сравнении с самим

приложением)

Page 44: Excelsior JET в действии

Parallel Concurrent Incremental

Mark Compact GC

• Алгоритм из класса трассирующих.

• Parallel – исполняется на нескольких процессорах во

время остановки мира

• Concurrent – делает часть работы во время исполнения

– foreground (потоки приложения занимаются сборкой мусора)

– background (в фоновом потоке)

• Incremental – не обходит все объекты каждый цикл

• Mark-Compact – решает компактизировать ли кучу

– делает это в «плановом порядке», а не «когда уже приперло»

– не делает перемещение и настроку части кучи каждый раз

– фрагментация кучи < 5% (чаще всего)

Page 45: Excelsior JET в действии

JIT + AOT модель исполнения

• Reflective shield: незарезолванные ссылки во время

AOT компиляции превращаются в специальный код

(рефлективные стабы), который может резолваться

во время исполнения.

• JIT и AOT порождают одни и те же ран-тайм

структуры.

• JIT и AOT имеют общий код

Page 46: Excelsior JET в действии

Планы

• Java 7 и Linux AMD64 (декабрь 2013)

• Mac OSX (май 2014)

• Java 8, Linux ARM, compact profiles

• iOS

• Android

Page 47: Excelsior JET в действии

Вопросы и

ответы

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

Павел Павлов

Excelsior

Page 48: Excelsior JET в действии

Компиляторный Hard Core