SlideShare ist ein Scribd-Unternehmen logo
1 von 83
Поддержка Java 8
в Excelsior JET
Никита Липский
Excelsior LLC
1
Кто знает про себя ?
• Более 20 лет профессиональной карьеры
• Инициатор проекта Excelsior JET
– работал над проектом более 16 лет
– как идейный вдохновитель
– компиляторный инженер
– руководитель
– и много в каких еще ролях
• Open source проекты WebFX и Java ReStart
– в свободное от работы время
• twitter: @pjBooms
2
Кто знает про Excelsior JET?
• Полная реализация Java SE
– c 2005 года cертифицирована как Java Compatible
• AOT compiler + Java Runtime
– смешанная компиляция: AOT + JIT
– поддержка нестандартных загрузчиков классов в AOT режиме (для
Eclipse RCP, Tomcat)
• Toolkit
– Startup Optimizer
– Deployment
3
Кто знает про Excelsior JET?
Кто знает про Excelsior JET?Кто знает про Excelsior JET?
4
Что добавлено в Java 8
• Lambda-expressions
• Default Methods
• Stream API, Time API
• Type annotations, Parameter names
• JavaFX 8
• Nashorn
• Compact Profiles
5
Default methods
6
Default Methods
• Методы с телами в интерфейсах
– Мотивация: расширение Java API, не ломая
обратную совместимость
List<Person> list = ...
list.forEach(System.out::println)
forEach нет в Java 7
7
Default Methods
Повлияли на спецификацию JVM:
• Изменилась семантика инструкций:
– Invokespecial
– invokevirtual
– invokeinterface
– invokestatic
• Изменилась процедура статической инициализации
класса
8
Resolve метода
• Все invoke инструкции (кроме
invokedynamic) ссылаются на вызываемый
метод cимвольно
• Перед тем как invoke инструкция
исполнится, должна пройти процедура
разрешения символьной ссылки на метод
9
Resolve метода
Пусть есть ссылка C.foo():
• Ищем foo в C:
• Если не нашли, ищем foo в суперклассах C
• Если не нашли, ищем foo в суперинтерфейсах C
• New in Java 8:
– при поиске метода в суперинтерфейсах, в начале
ищется максимально специфичный default метод
10
Resolve метода
Максимально специфичный default метод:
• default метод, который не переопределяется в
потомках данного интерфейса, которые
имплементируется классом C
• Если есть, то должен быть один
– Иначе процедура резолва бросает
IncompatibleClassChangeError
11
Resolve метода
interface I {
default void foo(){…}
}
class A {
void foo(){…}
}
class C extends A
implements I{
}
C.foo() - ?
12
Resolve метода
interface I {
default void foo(){…}
}
interface J extends I {
default void foo(){…}
}
class C implements J,I {
}
C.foo() - ?
13
Resolve метода
interface I {
default void foo(){…}
}
interface J {
default void foo(){…}
}
class C implements J,I {
}
C.foo() - ?
14
invokespecial
• Используется для вызова конструкторов и суперметодов
• Целевой метод вызова статически вычислим
– может вызываться напрямую
– может инлайниться сразу в вызывающий метод
• Вызывает метод (чаще всего), который возвращается
процедурой resolve метода
– т.o. может вызывать default методы в Java 8
15
invokespecial
• Поддержка в AOT компиляторе:
– Resolve методов происходит до исполнения
программы (но по JVM спецификации)
– Каждый метод, каждого компилируемого класса
компилируется в машинный код и имеет адрес
– invokespecial <MethofRef> транслируется в:
call <MethodAddress>
16
invokevirtual
• Вызываемый метод зависит от объекта
получателя (this)
• Транслируется в косвенный вызов через
таблицу виртуальных методов
invokevirtual <MethofRef>
->
call [<VMTAddress> +MethodSlotInVMT*C]
17
invokevirtual
• Схема представления объекта в памяти
18
19
abstract class A
implements I {
{
void meth1(){…}
abstract void meth2();
}
interface I {
void meth3();
}
class C extends A {
void meth2(){…}
void meth3(){…}
void meth4(){…}
}
AbstractMethodError
20
abstract class A
implements I {
{
void meth1(){…}
abstract void meth2();
}
interface I {
void meth3();
}
class C extends A {
implements J {
void meth2(){…}
}
interface J {
default void meth3(){…}
default void meth4(){…}
}
AbstractMethodError
New in Java 8
Поддержка default методов в
Excelsior JET
• Компиляция методов интерфейсов
• Изменение процедуры резолва методов
• Изменение процедуры заполнения VMT
21
Найденные баги при поддержки
Java 8 в Excelsior JET
• В JVM спецификации
– override метода
(https://bugs.openjdk.java.net/browse/JDK-8098577)
• В HotSpot
– статическая инициализация классов в присутствии default
методов инициализирует больше классов чем нужно
(https://bugs.openjdk.java.net/browse/JDK-8098557 )
– в resolve методов: “InterfaceMethod CP entry pointing to a
class should cause ICCE”
(https://bugs.openjdk.java.net/browse/JDK-8087223 )
22
Lambda выражения
23
Лямбда выражения
Было
new Thread(new Runnable() {
public void run() {
System.out.println(“Hi,I’m Thread”);
}
}).start();
24
Лямбда выражения
Стало …
new Thread(new Runnable() {
public void run() {
System.out.println(“Hi,I’m Thread”);
}
}).start();
25
Лямбда выражения
Стало
new Thread(()->
System.out.println(“Hi,I’m Thread”)
).start();
26
Лямбда выражения
Как лямбда-выражения повлияли
на спецификацию JVM?
27
Лямбда выражения
Как лямбда-выражения повлияли
на спецификацию JVM?
Никак!
28
Трансляция лямбда выражений в
Java байткод
class B {
public void foo() {
List<Person> list = ...
final int bottom = ..., top = ...;
list.removeIf( p ->
(p.size >= bottom && p.size <= top)
);
}
}
29
Трансляция лямбда выражений в
Java байткод
class B {
public void foo() {
List<Person> list = ...
final int bottom = ..., top = ...;
list.removeIf(new Predicate() {
public boolean apply(Person p) {
(p.size >= bottom && p.size <= top);
}
);
}
}
30
Трансляция лямбда выражений в
Java байткод
class B {
public void foo() {
List<Person> list = ...
final int bottom = ..., top = ...;
list.removeIf(new Predicate() {
public boolean apply(Object o) {
(p.size >= bottom && p.size <= top);
}
);
}
}
31
Трансляция лямбда выражений в
Java байткод
class B {
public void foo() {
List<Person> list = ...
final int bottom = ..., top = ...;
list.removeIf(
[lambda for lambda$1 as Predicate
capturing (bottom, top) ]
}
static boolean lambda$1(int bottom, int top, Person p)
{
return p.size >= bottom && p.size <= top;
}
}
32
Трансляция лямбда выражений в
Java байткод
class B {
public void foo() {
List<Person> list = ...
final int bottom = ..., top = ...;
list.removeIf(
indy((MH(metaFactory), //bootstrap
MH(invokeVirtual Predicate.apply),
MH(invokeStatic B.lambda$1))(bottom, top))
}
static boolean lambda$1(int bottom, int top, Person p)
{
return p.size >= bottom && p.size <= top;
}
}
33
Лямбда-выражения
А Indy – это фича Java 7!
34
Indy
Indy – сокращение от invokedynamic
• В первый раз indy зовет bootstrap метод,
который возвращает объект CallSite
• Далее и при последующих вызовах от объекта
callsite берется МethodHandle и зовется
invokeExact
35
MethodHandle
MethodHandle – целевой объект indy:
• может быть доступом к полю, методу
• адаптером других MethodHandle
– адаптеры аргументов
– частичное применение аргументов (binding)
– условный переход (guardWithTest)
Должны работать быстро
– Все что можно выразить через MethodHandle, можно выразить
через Reflection, но это неэффективно
36
MethodHandle
MethodHandles c Java 7 Update 40 реализованы
через lambda-forms:
– Внутреннее представление методхэндлов
– По этому внутреннему представлению
динамически порождается Java байткод (Runtime
анонимные классы)
– Реализация состоит на 90% из pure Java кода и
переиспользуется в Excelsior JET
37
Runtime анонимные классы
• Настолько анонимные, что их даже нет в
JVM спецификации
– полную семантику возможно вычислить только
из исходных текстов HotSpot
38
Runtime анонимные классы
• Из Java создаются через
Unsafe.defineAnonymousClass
• Не принадлежат какому-либо класслоадеру, их
нельзя найти, нет reflection
• В Java 8 их семантика поменялась
– они могут доступаться до private членов классов их
породивших (до тел лямбд)
39
Вернемся к лямбдам
Задача: Пусть есть Java код
Runnable r =
()->System.out.println(“Hi”);
r.run();
Требуется: вместо этого кода породить:
System.out.println(“Hi”);
40
Решение HotSpot
• Исполняем код метода, пока он не станет
горячим
– порождая и загружая анонимный класс-завертку
для лямбда выражения
• Инлайним в код целевого метода сначала код
единственного метода анонимного класса, а
затем и само тело лямбды
• Анонимный класс собираем GC
41
Решение JET*
• Восстанавливаем из байткода в статическом
компиляторе лямбда-выражение в исходном виде
• Вычисляем, что единственное использование лямбды –
это ее непосредственный вызов
• Инлайним тело лямбда выражения
* Пока не реализовано
42
Решение JET*
А если нам не удалось заинлайнить метод
куда передается лямбда-выражение?
43
Решение JET*
44
(p -> (p.size >= bottom && p.size <= top))
lambda$1: код тела лямбды
захваченный контекст
Решение JET*
45
(p -> (p.size >= bottom && p.size <= top))
j.l.Object methods
при вызове getClass() ,
создается класс на лету
lambda$1: код тела лямбды
захваченный контекст
Не нужно создавать класс для
большинства случаев
Лямбды в JET: текущий статус
• пока работают через indy, но тела лямбд
статически компилируются
• динамическая компиляция классов-заверток
для лямбд очень быстрая (<1ms)
• на стандартных бенчмарках, и реальных
приложениях пока не было замечено
уменьшения производительности из-за лямбд
46
Типовые аннотации
47
Типовые аннотации
Могут быть везде где есть тип:
class TypeAnnotationsExample {
@Encrypted String data;
List<@NonNull String> strings;
HashSet names =
(@Immutable HashSet) set;
}
48
Типовые аннотации
• Кодируются в Java байткоде атрибутом типа
Runtime(In)VisibleTypeAnnotation – новые
атрибуты Java 8 байткода
• Доступны в рантайм через Reflection API:
– getTypeAnnotations
Как представляются в Excelsior JET?
49
Reflection в HotSpot
• HotSpot JVM хранит в MetaSpace рантайм
представление Java класс-файла
• В класс-файле есть вся нужная информация
для reflection
• Реализация Reflection API в HotSpot работает
непосредственно с класс-файлами
50
Reflection в Excelsior JET
• После статической компиляции от классов не
остается класс-файлов
– После резолва ссылок в AOT компиляторе и трансляции
байткода в машинный код, большая часть класс-файла
становится не нужна в своем первоначальном виде.
• Мета-информация о классах пишется в
исполняемый файл в секцию данных
• Пишется только то, что необходимо Reflection
– имена полей, методов, аннотации
51
Reflection в Excelsior JET
• Аннотации пишутся в формате очень похожем
на формат аннотаций в Java байткоде
– можно переиспользовать Java код, который их
разбирает
Для Java 8 AOT компилятор пришлось научить
сохранять типовые аннотации
52
Имена параметров
• Если javac задать ключ –parameters, то
– в класс-файл будут писаться имена параметров
– имена параметров будут доступны через reflection
Как представляются в Excelsior JET?
Легко!
53
New Java 8 APIs
54
New Java 8 APIs
• Stream API
• Time API
• JavaFX 8
• Nashorn
Как поддерживаются в JET?
Также как и все остальные Java API !
55
New Java 8 APIs
• Stream API
• Time API
• JavaFX 8
• Nashorn
Как поддерживаются в JET?
Также как и все остальные Java API !
56
New Java 8 APIs
• Excelsior – официальный Java SE licensee
– лицензируем все исходные тексты Java SE у Oracle
– можем поступать с ними как хотим, например
компилировать Java байт-код платформы в
машинный код и использовать свою реализацию
JVM
– обязаны проходить тесты на совместимость (JCK)
57
New Java 8 APIs
Не все Java 8 APIs одинаково стандартны:
• Stream API, Time API входят в стандарт
Java 8
• Nashorn, JavaFX НЕ входят в стандарт Java SE
– в частности нет тестов JCK
58
Структура Oracle JRE
59
Структура Oracle JRE
• Классы Nashorn и JavaFX находятся в папке
ext
– грузятся Extension класслоадером
• Все что находится в папке ext можно
официально не включать в Private JRE
дистрибутива своего приложения
60
Распространение приложений
скомпилированных Excelsior JET
• Скомпилированные с помощью Excelsior JET
приложения всегда распространяются с
приватной копией JET Runtime:
– ваши пользователи не должны ставить
“Excelsior JRE”
61
Распространение приложений
скомпилированных Excelsior JET
• Структура JET Runtime на диске очень
похожа на Oracle JRE:
– ресурсы (шрифты, картинки) и библиотеки с
native методами находятся на тех же местах
– классы из rt.jar и других .jar компилируются в
набор DLL
62
JetPackII
Подготавливает ваше приложение для дальнейшего распространения
63
JetPackII
• JET-скомпилированные исполняемые файлы
связываются с приватной копией JET Runtime
• Позволяет выбирать нужные части JET Runtime
для вашего приложения
• New in Java 8: позволяет НЕ включать JavaFX и
Nashorn, если они не используются вашим
приложением
64
Compact Profiles
65
Compact Profiles
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
66
Compact Profiles
• Есть в Java SE Embedded (Linux builds)
• В OpenJDK (не собираются на Windows и
Mac OS X)
67
История компонентизации
Java SE от Excelsior
• Разбиение Java SE на APIs (2000 год)
– компиляция их в DLL
• JetPerfect (2001 год)
– компиляция приложений с нужными частями Java SE в один
EXE файл
– SWT Example: 1.4 MB
• Java Runtime Slim-Down (2007 год)
– совместимое с Java SE спецификацией решение
• Compact Profiles (2016 год)
68
История компонентизации
Java SE от Sun/Oracle
• Kernel JRE (2006 год)
• Project Jigsaw 2007 – 2017(?)
• Compact Profiles (2014 год)
69
Compact Profiles
• Первый рабочий и легальный способ
уменьшения Private JRE
• Есть JCK (тесты совместимости)
70
Compact Profiles
• Первый рабочий и легальный способ
уменьшения Private JRE
• Есть JCK (тесты совместимости)
• Есть в Excelsior JET для всех десктопных
платформ (Windows, Linux, Mac OS X)
71
Compact Profiles
• Поддержка в Excelsior JET:
– Переразбивка JET RT DLLs по границам Compact
Profiles
– Поддержка в JetPackII: паковка приложения с
компактным профилем, на котором может быть
запущено приложение
– Проходит JCK для соответствующих компактных
профилей
72
JavaFX on Compact Profiles
73
JavaFX 8 on Compact Profiles
• JavaFX условно состоит из трех логических
частей:
– Core JavaFX
– JavaFX Web (WebKit based)
– JavaFX bridges to Swing и SWT
74
JavaFX 8 on Compact Profiles
• Core JavaFX может работать на Compact2
– FXML зависит от XML
• JavaFX Swing Bridge требует Full Java SE
– Так как очевидно зависит от Swing
75
JavaFX 8 on Compact Profiles
• JavaFX Web тоже имеет зависимости от AWT
…
76
JavaFX 8 on Compact Profiles
• JavaFX Web тоже имеет зависимости от
AWT, которые не разрешаются во время
исполнения !
77
JavaFX 8 on Compact Profiles
• JavaFX Web тоже имеет зависимости от
AWT, которые не разрешаются во время
исполнения, кроме одной  …
78
JavaFX 8 on Compact Profiles
• JavaFX Web тоже имеет зависимости от
AWT, которые не разрешаются во время
исполнения, кроме одной, которая тоже не
разрешается в режиме -Xverify:none
79
JavaFX 8 on Compact Profiles
Поддержка JavaFX Web в Excelsior JET:
• зависимости от AWT откладываются до разрешения
во время исполнения
– не разрешаются в статическом компиляторе
• Все классы JavaFX верифицируются до исполнения
– не требуется верификация во время исполнения и
загрузка “лишних” классов
• В результате JavaFX Web работает на Compact2!
80
Java Packager (Oracle JDK) vs.
JetPackII (Excelsior JET)
Java
Packager
JetPackII with Compact
Profiles
Ensemble Demo
(with WebView sample)
46 MB 21 MB
BrickBreaker 42 MB 10 MB
81
Примечание: замеры производились на Windows 32-bit для Java 8 Update 72,
представлены размеры дистрибутивов без зависимостей
Заключение
• Java 8 – лучший релиз Java со времен Java 5
– лямбды повышают производительность труда
• Лямбды не повлияли на спецификацию JVM
– но желательна специальная поддержка в JVM
• Compact Profiles уменьшают размер Private JRE
– важно для магазинов приложений и в embedded
• Java != HotSpot
82
Вопросы и ответы
Никита Липский,
Excelsior
nlipsky@excelsior-usa.com
twitter: @pjBooms 83

Weitere ähnliche Inhalte

Was ist angesagt?

Java 9 модули
Java 9 модулиJava 9 модули
Java 9 модулиZheka Kozlov
 
AOT для Java: Мифы и Challenges
AOT для Java: Мифы и ChallengesAOT для Java: Мифы и Challenges
AOT для Java: Мифы и ChallengesNikita Lipsky
 
Tech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция JavaTech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция JavaTech Talks @NSU
 
Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended versionIvan Krylov
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.Igor Shkulipa
 
Статический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокСтатический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокAndrey Karpov
 
09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программRoman Brovko
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотомRoman Grebennikov
 
01 - Java. Введение в Java
01 - Java. Введение в Java01 - Java. Введение в Java
01 - Java. Введение в JavaRoman Brovko
 
Java худеет. Спроси меня как.
Java худеет. Спроси меня как.Java худеет. Спроси меня как.
Java худеет. Спроси меня как.Nikita Lipsky
 
Никита Липский и Владимир Парфиненко
Никита Липский и Владимир ПарфиненкоНикита Липский и Владимир Парфиненко
Никита Липский и Владимир ПарфиненкоCodeFest
 
Akka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный кодAkka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный кодRoman Grebennikov
 
Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиAndrey Karpov
 
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...CodeFest
 
JUnit, дай пять!
JUnit, дай пять!JUnit, дай пять!
JUnit, дай пять!Dmitrii Tuchs
 

Was ist angesagt? (19)

Java 9 модули
Java 9 модулиJava 9 модули
Java 9 модули
 
AOT для Java: Мифы и Challenges
AOT для Java: Мифы и ChallengesAOT для Java: Мифы и Challenges
AOT для Java: Мифы и Challenges
 
Tech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция JavaTech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция Java
 
Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended version
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
 
Статический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокСтатический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибок
 
Java 9 - Back to the Future
Java 9 - Back to the FutureJava 9 - Back to the Future
Java 9 - Back to the Future
 
09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
 
01 - Java. Введение в Java
01 - Java. Введение в Java01 - Java. Введение в Java
01 - Java. Введение в Java
 
Java худеет. Спроси меня как.
Java худеет. Спроси меня как.Java худеет. Спроси меня как.
Java худеет. Спроси меня как.
 
Java: вчера, сегодня, завтра
Java: вчера, сегодня, завтраJava: вчера, сегодня, завтра
Java: вчера, сегодня, завтра
 
Никита Липский и Владимир Парфиненко
Никита Липский и Владимир ПарфиненкоНикита Липский и Владимир Парфиненко
Никита Липский и Владимир Парфиненко
 
Akka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный кодAkka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный код
 
Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщики
 
DevOps guide for awesome quality assurance
DevOps guide for awesome quality assuranceDevOps guide for awesome quality assurance
DevOps guide for awesome quality assurance
 
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
 
JUnit, дай пять!
JUnit, дай пять!JUnit, дай пять!
JUnit, дай пять!
 

Andere mochten auch

Autolibertação
AutolibertaçãoAutolibertação
AutolibertaçãoVal Ruas
 
Положення про екстернат
Положення про екстернатПоложення про екстернат
Положення про екстернатExternKyiv
 
Beth's powerpoint analysis
Beth's powerpoint analysisBeth's powerpoint analysis
Beth's powerpoint analysismicgar12
 
Sebas 1001
Sebas 1001Sebas 1001
Sebas 1001JHON_05
 
A checking fixture design of corrugated pieces in Clutch assembly of automobi...
A checking fixture design of corrugated pieces in Clutch assembly of automobi...A checking fixture design of corrugated pieces in Clutch assembly of automobi...
A checking fixture design of corrugated pieces in Clutch assembly of automobi...IJRES Journal
 
Eletronica e manutenção itabuna
Eletronica e manutenção itabunaEletronica e manutenção itabuna
Eletronica e manutenção itabunaAndrei Sansil
 
Development of low cost TDR system for soil moisture measurement
Development of low cost TDR system for soil moisture measurementDevelopment of low cost TDR system for soil moisture measurement
Development of low cost TDR system for soil moisture measurementBhushan Patil
 
An improved color image encryption algorithm with pixel permutation and bit s...
An improved color image encryption algorithm with pixel permutation and bit s...An improved color image encryption algorithm with pixel permutation and bit s...
An improved color image encryption algorithm with pixel permutation and bit s...eSAT Journals
 
Lavancha renewable energy presentation solar and wind hybrid power plant
Lavancha renewable energy presentation solar and wind hybrid power plantLavancha renewable energy presentation solar and wind hybrid power plant
Lavancha renewable energy presentation solar and wind hybrid power plantLavancha_Energy-redefined
 
The College of New Jersey Presentation 11 30-15
The College of New Jersey Presentation 11 30-15The College of New Jersey Presentation 11 30-15
The College of New Jersey Presentation 11 30-15Robert Carr
 

Andere mochten auch (14)

Autolibertação
AutolibertaçãoAutolibertação
Autolibertação
 
Light
LightLight
Light
 
Положення про екстернат
Положення про екстернатПоложення про екстернат
Положення про екстернат
 
Beth's powerpoint analysis
Beth's powerpoint analysisBeth's powerpoint analysis
Beth's powerpoint analysis
 
Sebas 1001
Sebas 1001Sebas 1001
Sebas 1001
 
A checking fixture design of corrugated pieces in Clutch assembly of automobi...
A checking fixture design of corrugated pieces in Clutch assembly of automobi...A checking fixture design of corrugated pieces in Clutch assembly of automobi...
A checking fixture design of corrugated pieces in Clutch assembly of automobi...
 
Eletronica e manutenção itabuna
Eletronica e manutenção itabunaEletronica e manutenção itabuna
Eletronica e manutenção itabuna
 
ppp
pppppp
ppp
 
Dimensi tiga
Dimensi tigaDimensi tiga
Dimensi tiga
 
A
AA
A
 
Development of low cost TDR system for soil moisture measurement
Development of low cost TDR system for soil moisture measurementDevelopment of low cost TDR system for soil moisture measurement
Development of low cost TDR system for soil moisture measurement
 
An improved color image encryption algorithm with pixel permutation and bit s...
An improved color image encryption algorithm with pixel permutation and bit s...An improved color image encryption algorithm with pixel permutation and bit s...
An improved color image encryption algorithm with pixel permutation and bit s...
 
Lavancha renewable energy presentation solar and wind hybrid power plant
Lavancha renewable energy presentation solar and wind hybrid power plantLavancha renewable energy presentation solar and wind hybrid power plant
Lavancha renewable energy presentation solar and wind hybrid power plant
 
The College of New Jersey Presentation 11 30-15
The College of New Jersey Presentation 11 30-15The College of New Jersey Presentation 11 30-15
The College of New Jersey Presentation 11 30-15
 

Ähnlich wie Поддержка Java 8 в Excelsior JET

"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013Vladimir Ivanov
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage CollectorOlexandra Dmytrenko
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПKirill Chebunin
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilationNikita Lipsky
 
Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Anton Arhipov
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаAlexander Kucherenko
 
JPoint 2016 - Bytecode
JPoint 2016 - BytecodeJPoint 2016 - Bytecode
JPoint 2016 - BytecodeAnton Arhipov
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьAndrey Bibichev
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полнойОмские ИТ-субботники
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6Technopark
 
Инструментация среды исполнения в арсенале тестировщика
Инструментация среды исполнения в арсенале тестировщикаИнструментация среды исполнения в арсенале тестировщика
Инструментация среды исполнения в арсенале тестировщикаSQALab
 
Михаил Давыдов: JavaScript. Базовые знания
Михаил Давыдов: JavaScript. Базовые знанияМихаил Давыдов: JavaScript. Базовые знания
Михаил Давыдов: JavaScript. Базовые знанияYandex
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...corehard_by
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...Andrey Karpov
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013ScalaNsk
 
8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threadsMERA_school
 

Ähnlich wie Поддержка Java 8 в Excelsior JET (20)

Bytecode
BytecodeBytecode
Bytecode
 
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage Collector
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
TeaVM: dead code elimination and devirtualization
TeaVM: dead code elimination and devirtualizationTeaVM: dead code elimination and devirtualization
TeaVM: dead code elimination and devirtualization
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilation
 
Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языка
 
JPoint 2016 - Bytecode
JPoint 2016 - BytecodeJPoint 2016 - Bytecode
JPoint 2016 - Bytecode
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связность
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6
 
Инструментация среды исполнения в арсенале тестировщика
Инструментация среды исполнения в арсенале тестировщикаИнструментация среды исполнения в арсенале тестировщика
Инструментация среды исполнения в арсенале тестировщика
 
Михаил Давыдов: JavaScript. Базовые знания
Михаил Давыдов: JavaScript. Базовые знанияМихаил Давыдов: JavaScript. Базовые знания
Михаил Давыдов: JavaScript. Базовые знания
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
 
8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threads
 

Mehr von Nikita Lipsky

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 LayersNikita Lipsky
 
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...Nikita Lipsky
 
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 DeposeNikita Lipsky
 
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 Nikita Lipsky
 
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 ApplicationsNikita Lipsky
 
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 ApplicationsNikita Lipsky
 
Java Restart with WebFX
Java Restart with WebFX Java Restart with WebFX
Java Restart with WebFX Nikita Lipsky
 
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?Веб 3.0. Есть ли будущее у Java в RIA и Mobile?
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?Nikita Lipsky
 
Занимательные истории из жизни технической поддержки JVM
Занимательные истории из жизни технической поддержки JVMЗанимательные истории из жизни технической поддержки JVM
Занимательные истории из жизни технической поддержки JVMNikita Lipsky
 
Неумолимая близость десктопа, веба и мобайла
Неумолимая близость десктопа, веба и мобайлаНеумолимая близость десктопа, веба и мобайла
Неумолимая близость десктопа, веба и мобайлаNikita Lipsky
 
История одной JVM в картинках
История одной JVM в картинкахИстория одной JVM в картинках
История одной JVM в картинкахNikita Lipsky
 

Mehr von Nikita Lipsky (11)

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
 
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
 
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 в картинках
 

Поддержка Java 8 в Excelsior JET

  • 1. Поддержка Java 8 в Excelsior JET Никита Липский Excelsior LLC 1
  • 2. Кто знает про себя ? • Более 20 лет профессиональной карьеры • Инициатор проекта Excelsior JET – работал над проектом более 16 лет – как идейный вдохновитель – компиляторный инженер – руководитель – и много в каких еще ролях • Open source проекты WebFX и Java ReStart – в свободное от работы время • twitter: @pjBooms 2
  • 3. Кто знает про Excelsior JET? • Полная реализация Java SE – c 2005 года cертифицирована как Java Compatible • AOT compiler + Java Runtime – смешанная компиляция: AOT + JIT – поддержка нестандартных загрузчиков классов в AOT режиме (для Eclipse RCP, Tomcat) • Toolkit – Startup Optimizer – Deployment 3
  • 4. Кто знает про Excelsior JET? Кто знает про Excelsior JET?Кто знает про Excelsior JET? 4
  • 5. Что добавлено в Java 8 • Lambda-expressions • Default Methods • Stream API, Time API • Type annotations, Parameter names • JavaFX 8 • Nashorn • Compact Profiles 5
  • 7. Default Methods • Методы с телами в интерфейсах – Мотивация: расширение Java API, не ломая обратную совместимость List<Person> list = ... list.forEach(System.out::println) forEach нет в Java 7 7
  • 8. Default Methods Повлияли на спецификацию JVM: • Изменилась семантика инструкций: – Invokespecial – invokevirtual – invokeinterface – invokestatic • Изменилась процедура статической инициализации класса 8
  • 9. Resolve метода • Все invoke инструкции (кроме invokedynamic) ссылаются на вызываемый метод cимвольно • Перед тем как invoke инструкция исполнится, должна пройти процедура разрешения символьной ссылки на метод 9
  • 10. Resolve метода Пусть есть ссылка C.foo(): • Ищем foo в C: • Если не нашли, ищем foo в суперклассах C • Если не нашли, ищем foo в суперинтерфейсах C • New in Java 8: – при поиске метода в суперинтерфейсах, в начале ищется максимально специфичный default метод 10
  • 11. Resolve метода Максимально специфичный default метод: • default метод, который не переопределяется в потомках данного интерфейса, которые имплементируется классом C • Если есть, то должен быть один – Иначе процедура резолва бросает IncompatibleClassChangeError 11
  • 12. Resolve метода interface I { default void foo(){…} } class A { void foo(){…} } class C extends A implements I{ } C.foo() - ? 12
  • 13. Resolve метода interface I { default void foo(){…} } interface J extends I { default void foo(){…} } class C implements J,I { } C.foo() - ? 13
  • 14. Resolve метода interface I { default void foo(){…} } interface J { default void foo(){…} } class C implements J,I { } C.foo() - ? 14
  • 15. invokespecial • Используется для вызова конструкторов и суперметодов • Целевой метод вызова статически вычислим – может вызываться напрямую – может инлайниться сразу в вызывающий метод • Вызывает метод (чаще всего), который возвращается процедурой resolve метода – т.o. может вызывать default методы в Java 8 15
  • 16. invokespecial • Поддержка в AOT компиляторе: – Resolve методов происходит до исполнения программы (но по JVM спецификации) – Каждый метод, каждого компилируемого класса компилируется в машинный код и имеет адрес – invokespecial <MethofRef> транслируется в: call <MethodAddress> 16
  • 17. invokevirtual • Вызываемый метод зависит от объекта получателя (this) • Транслируется в косвенный вызов через таблицу виртуальных методов invokevirtual <MethofRef> -> call [<VMTAddress> +MethodSlotInVMT*C] 17
  • 18. invokevirtual • Схема представления объекта в памяти 18
  • 19. 19 abstract class A implements I { { void meth1(){…} abstract void meth2(); } interface I { void meth3(); } class C extends A { void meth2(){…} void meth3(){…} void meth4(){…} } AbstractMethodError
  • 20. 20 abstract class A implements I { { void meth1(){…} abstract void meth2(); } interface I { void meth3(); } class C extends A { implements J { void meth2(){…} } interface J { default void meth3(){…} default void meth4(){…} } AbstractMethodError New in Java 8
  • 21. Поддержка default методов в Excelsior JET • Компиляция методов интерфейсов • Изменение процедуры резолва методов • Изменение процедуры заполнения VMT 21
  • 22. Найденные баги при поддержки Java 8 в Excelsior JET • В JVM спецификации – override метода (https://bugs.openjdk.java.net/browse/JDK-8098577) • В HotSpot – статическая инициализация классов в присутствии default методов инициализирует больше классов чем нужно (https://bugs.openjdk.java.net/browse/JDK-8098557 ) – в resolve методов: “InterfaceMethod CP entry pointing to a class should cause ICCE” (https://bugs.openjdk.java.net/browse/JDK-8087223 ) 22
  • 24. Лямбда выражения Было new Thread(new Runnable() { public void run() { System.out.println(“Hi,I’m Thread”); } }).start(); 24
  • 25. Лямбда выражения Стало … new Thread(new Runnable() { public void run() { System.out.println(“Hi,I’m Thread”); } }).start(); 25
  • 27. Лямбда выражения Как лямбда-выражения повлияли на спецификацию JVM? 27
  • 28. Лямбда выражения Как лямбда-выражения повлияли на спецификацию JVM? Никак! 28
  • 29. Трансляция лямбда выражений в Java байткод class B { public void foo() { List<Person> list = ... final int bottom = ..., top = ...; list.removeIf( p -> (p.size >= bottom && p.size <= top) ); } } 29
  • 30. Трансляция лямбда выражений в Java байткод class B { public void foo() { List<Person> list = ... final int bottom = ..., top = ...; list.removeIf(new Predicate() { public boolean apply(Person p) { (p.size >= bottom && p.size <= top); } ); } } 30
  • 31. Трансляция лямбда выражений в Java байткод class B { public void foo() { List<Person> list = ... final int bottom = ..., top = ...; list.removeIf(new Predicate() { public boolean apply(Object o) { (p.size >= bottom && p.size <= top); } ); } } 31
  • 32. Трансляция лямбда выражений в Java байткод class B { public void foo() { List<Person> list = ... final int bottom = ..., top = ...; list.removeIf( [lambda for lambda$1 as Predicate capturing (bottom, top) ] } static boolean lambda$1(int bottom, int top, Person p) { return p.size >= bottom && p.size <= top; } } 32
  • 33. Трансляция лямбда выражений в Java байткод class B { public void foo() { List<Person> list = ... final int bottom = ..., top = ...; list.removeIf( indy((MH(metaFactory), //bootstrap MH(invokeVirtual Predicate.apply), MH(invokeStatic B.lambda$1))(bottom, top)) } static boolean lambda$1(int bottom, int top, Person p) { return p.size >= bottom && p.size <= top; } } 33
  • 34. Лямбда-выражения А Indy – это фича Java 7! 34
  • 35. Indy Indy – сокращение от invokedynamic • В первый раз indy зовет bootstrap метод, который возвращает объект CallSite • Далее и при последующих вызовах от объекта callsite берется МethodHandle и зовется invokeExact 35
  • 36. MethodHandle MethodHandle – целевой объект indy: • может быть доступом к полю, методу • адаптером других MethodHandle – адаптеры аргументов – частичное применение аргументов (binding) – условный переход (guardWithTest) Должны работать быстро – Все что можно выразить через MethodHandle, можно выразить через Reflection, но это неэффективно 36
  • 37. MethodHandle MethodHandles c Java 7 Update 40 реализованы через lambda-forms: – Внутреннее представление методхэндлов – По этому внутреннему представлению динамически порождается Java байткод (Runtime анонимные классы) – Реализация состоит на 90% из pure Java кода и переиспользуется в Excelsior JET 37
  • 38. Runtime анонимные классы • Настолько анонимные, что их даже нет в JVM спецификации – полную семантику возможно вычислить только из исходных текстов HotSpot 38
  • 39. Runtime анонимные классы • Из Java создаются через Unsafe.defineAnonymousClass • Не принадлежат какому-либо класслоадеру, их нельзя найти, нет reflection • В Java 8 их семантика поменялась – они могут доступаться до private членов классов их породивших (до тел лямбд) 39
  • 40. Вернемся к лямбдам Задача: Пусть есть Java код Runnable r = ()->System.out.println(“Hi”); r.run(); Требуется: вместо этого кода породить: System.out.println(“Hi”); 40
  • 41. Решение HotSpot • Исполняем код метода, пока он не станет горячим – порождая и загружая анонимный класс-завертку для лямбда выражения • Инлайним в код целевого метода сначала код единственного метода анонимного класса, а затем и само тело лямбды • Анонимный класс собираем GC 41
  • 42. Решение JET* • Восстанавливаем из байткода в статическом компиляторе лямбда-выражение в исходном виде • Вычисляем, что единственное использование лямбды – это ее непосредственный вызов • Инлайним тело лямбда выражения * Пока не реализовано 42
  • 43. Решение JET* А если нам не удалось заинлайнить метод куда передается лямбда-выражение? 43
  • 44. Решение JET* 44 (p -> (p.size >= bottom && p.size <= top)) lambda$1: код тела лямбды захваченный контекст
  • 45. Решение JET* 45 (p -> (p.size >= bottom && p.size <= top)) j.l.Object methods при вызове getClass() , создается класс на лету lambda$1: код тела лямбды захваченный контекст Не нужно создавать класс для большинства случаев
  • 46. Лямбды в JET: текущий статус • пока работают через indy, но тела лямбд статически компилируются • динамическая компиляция классов-заверток для лямбд очень быстрая (<1ms) • на стандартных бенчмарках, и реальных приложениях пока не было замечено уменьшения производительности из-за лямбд 46
  • 48. Типовые аннотации Могут быть везде где есть тип: class TypeAnnotationsExample { @Encrypted String data; List<@NonNull String> strings; HashSet names = (@Immutable HashSet) set; } 48
  • 49. Типовые аннотации • Кодируются в Java байткоде атрибутом типа Runtime(In)VisibleTypeAnnotation – новые атрибуты Java 8 байткода • Доступны в рантайм через Reflection API: – getTypeAnnotations Как представляются в Excelsior JET? 49
  • 50. Reflection в HotSpot • HotSpot JVM хранит в MetaSpace рантайм представление Java класс-файла • В класс-файле есть вся нужная информация для reflection • Реализация Reflection API в HotSpot работает непосредственно с класс-файлами 50
  • 51. Reflection в Excelsior JET • После статической компиляции от классов не остается класс-файлов – После резолва ссылок в AOT компиляторе и трансляции байткода в машинный код, большая часть класс-файла становится не нужна в своем первоначальном виде. • Мета-информация о классах пишется в исполняемый файл в секцию данных • Пишется только то, что необходимо Reflection – имена полей, методов, аннотации 51
  • 52. Reflection в Excelsior JET • Аннотации пишутся в формате очень похожем на формат аннотаций в Java байткоде – можно переиспользовать Java код, который их разбирает Для Java 8 AOT компилятор пришлось научить сохранять типовые аннотации 52
  • 53. Имена параметров • Если javac задать ключ –parameters, то – в класс-файл будут писаться имена параметров – имена параметров будут доступны через reflection Как представляются в Excelsior JET? Легко! 53
  • 54. New Java 8 APIs 54
  • 55. New Java 8 APIs • Stream API • Time API • JavaFX 8 • Nashorn Как поддерживаются в JET? Также как и все остальные Java API ! 55
  • 56. New Java 8 APIs • Stream API • Time API • JavaFX 8 • Nashorn Как поддерживаются в JET? Также как и все остальные Java API ! 56
  • 57. New Java 8 APIs • Excelsior – официальный Java SE licensee – лицензируем все исходные тексты Java SE у Oracle – можем поступать с ними как хотим, например компилировать Java байт-код платформы в машинный код и использовать свою реализацию JVM – обязаны проходить тесты на совместимость (JCK) 57
  • 58. New Java 8 APIs Не все Java 8 APIs одинаково стандартны: • Stream API, Time API входят в стандарт Java 8 • Nashorn, JavaFX НЕ входят в стандарт Java SE – в частности нет тестов JCK 58
  • 60. Структура Oracle JRE • Классы Nashorn и JavaFX находятся в папке ext – грузятся Extension класслоадером • Все что находится в папке ext можно официально не включать в Private JRE дистрибутива своего приложения 60
  • 61. Распространение приложений скомпилированных Excelsior JET • Скомпилированные с помощью Excelsior JET приложения всегда распространяются с приватной копией JET Runtime: – ваши пользователи не должны ставить “Excelsior JRE” 61
  • 62. Распространение приложений скомпилированных Excelsior JET • Структура JET Runtime на диске очень похожа на Oracle JRE: – ресурсы (шрифты, картинки) и библиотеки с native методами находятся на тех же местах – классы из rt.jar и других .jar компилируются в набор DLL 62
  • 63. JetPackII Подготавливает ваше приложение для дальнейшего распространения 63
  • 64. JetPackII • JET-скомпилированные исполняемые файлы связываются с приватной копией JET Runtime • Позволяет выбирать нужные части JET Runtime для вашего приложения • New in Java 8: позволяет НЕ включать JavaFX и Nashorn, если они не используются вашим приложением 64
  • 66. Compact Profiles 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 66
  • 67. Compact Profiles • Есть в Java SE Embedded (Linux builds) • В OpenJDK (не собираются на Windows и Mac OS X) 67
  • 68. История компонентизации Java SE от Excelsior • Разбиение Java SE на APIs (2000 год) – компиляция их в DLL • JetPerfect (2001 год) – компиляция приложений с нужными частями Java SE в один EXE файл – SWT Example: 1.4 MB • Java Runtime Slim-Down (2007 год) – совместимое с Java SE спецификацией решение • Compact Profiles (2016 год) 68
  • 69. История компонентизации Java SE от Sun/Oracle • Kernel JRE (2006 год) • Project Jigsaw 2007 – 2017(?) • Compact Profiles (2014 год) 69
  • 70. Compact Profiles • Первый рабочий и легальный способ уменьшения Private JRE • Есть JCK (тесты совместимости) 70
  • 71. Compact Profiles • Первый рабочий и легальный способ уменьшения Private JRE • Есть JCK (тесты совместимости) • Есть в Excelsior JET для всех десктопных платформ (Windows, Linux, Mac OS X) 71
  • 72. Compact Profiles • Поддержка в Excelsior JET: – Переразбивка JET RT DLLs по границам Compact Profiles – Поддержка в JetPackII: паковка приложения с компактным профилем, на котором может быть запущено приложение – Проходит JCK для соответствующих компактных профилей 72
  • 73. JavaFX on Compact Profiles 73
  • 74. JavaFX 8 on Compact Profiles • JavaFX условно состоит из трех логических частей: – Core JavaFX – JavaFX Web (WebKit based) – JavaFX bridges to Swing и SWT 74
  • 75. JavaFX 8 on Compact Profiles • Core JavaFX может работать на Compact2 – FXML зависит от XML • JavaFX Swing Bridge требует Full Java SE – Так как очевидно зависит от Swing 75
  • 76. JavaFX 8 on Compact Profiles • JavaFX Web тоже имеет зависимости от AWT … 76
  • 77. JavaFX 8 on Compact Profiles • JavaFX Web тоже имеет зависимости от AWT, которые не разрешаются во время исполнения ! 77
  • 78. JavaFX 8 on Compact Profiles • JavaFX Web тоже имеет зависимости от AWT, которые не разрешаются во время исполнения, кроме одной  … 78
  • 79. JavaFX 8 on Compact Profiles • JavaFX Web тоже имеет зависимости от AWT, которые не разрешаются во время исполнения, кроме одной, которая тоже не разрешается в режиме -Xverify:none 79
  • 80. JavaFX 8 on Compact Profiles Поддержка JavaFX Web в Excelsior JET: • зависимости от AWT откладываются до разрешения во время исполнения – не разрешаются в статическом компиляторе • Все классы JavaFX верифицируются до исполнения – не требуется верификация во время исполнения и загрузка “лишних” классов • В результате JavaFX Web работает на Compact2! 80
  • 81. Java Packager (Oracle JDK) vs. JetPackII (Excelsior JET) Java Packager JetPackII with Compact Profiles Ensemble Demo (with WebView sample) 46 MB 21 MB BrickBreaker 42 MB 10 MB 81 Примечание: замеры производились на Windows 32-bit для Java 8 Update 72, представлены размеры дистрибутивов без зависимостей
  • 82. Заключение • Java 8 – лучший релиз Java со времен Java 5 – лямбды повышают производительность труда • Лямбды не повлияли на спецификацию JVM – но желательна специальная поддержка в JVM • Compact Profiles уменьшают размер Private JRE – важно для магазинов приложений и в embedded • Java != HotSpot 82
  • 83. Вопросы и ответы Никита Липский, Excelsior nlipsky@excelsior-usa.com twitter: @pjBooms 83