SlideShare a Scribd company logo
1 of 90
Download to read offline
AOT	для	Java	
Мифы	и	Challenges	
	
1
Никита Липский
Excelsior
Äàâíûì äàâíî,
Âî âðåìåíà Ñ+++,
Âñå êîìïèëÿòîðû
áûëè ñòàòè÷åñêèå ++++++	
2
Äàâíûì äàâíî,
Âî âðåìåíà Ñ+++,
Âñå êîìïèëÿòîðû
áûëè ñòàòè÷åñêèå ++++++	
3
Äàâíûì äàâíî,
Âî âðåìåíà Ñ+++,
Âñå êîìïèëÿòîðû
áûëè ñòàòè÷åñêèå ++++++	
4
Ïîêà íå ïîÿâèëàñü..
	
5
Ïîêà íå ïîÿâèëàñü
Java 	
6
•  Интерпретация	
•  Компиляция	в	машинный	код	и	исполнение	
на	“железе”	
Исполнение		
Java	байткода	JVM	
7
Трансляция	Java	to	NaIve	
•  Динамическая	(Just-In-Time	–	JIT).		
–  Трансляция	происходит	во	время	исполнения	
программы	
•  Статическая	(Ahead-Of-Time	–	AOT)	
–  Трансляция	происходит	до	исполнения	программы	
8
9
План	доклада	
•  Мифы	вокруг	статической	компиляции	Java	
•  Java	AOT	Challenges		
•  Применение	AOT	для	ускорения	startup,	
защиты	приложений	от	декомпиляции.	
•  Производительность	
•  AOT	в	разных	областях	применения	Java	
–  client	side,	server	side,	embedded,	IOT,	mobile.	
10
11
Кому	нужен	AOT	для	Java?		
12
Кто знает про Excelsior JET?Кто знает про Excelsior JET?
Мифы	вокруг	статической	
компиляции	Java	
13
Миф	1.	Java	-		«слишком»	динамическая		
ReflecIon	
	
	
	
	
Динамическая	загрузка	
14
Миф	2.	AOT	компиляция	–	убийца	WORA	
WORA	
	
Write	Once	
Run	Anywhere	
	
	
BORA	
Build	Once	
	Run	Anywhere	
15
!=
Миф	3.	AOT	=	маленький	Exe	
”Я	получу	(маленький)	исполняемый	файл,	
который	будет	работать	без	JVM	(как	в	С)”	
	
Но:	
– Стандартные	классы?	
– 	GC,	reflecron?	
16
Миф	3.	AOT	=	маленький	Exe	
	
Тем	не	менее,	используя	AOT,	можно	получить		
дистрибутив	Java	приложения	без	зависимостей	
от	Java	значительно	меньший,	чем	размер	JRE:	
	
“Javа	худеет”:		
htps://www.youtube.com/results?search_query=javaday+худеет		
17
Java	«слишком»	динамическая	
18
Нестандартные	загрузчики	классов	
•  Переопределяют	умолчательную	логику	разрешений	
ссылок	между	классами	
•  Уникальное	пространство	имен	
•  Позволяют	управлять	зависимостями,	решая	проблемы	
JAR	hell	(OSGi,	Java	Module	System)	
•  Java	EE	сервера,	Eclipse	RCP,	плагины	
19
Нестандартные	загрузчики	классов	
Как	компилировать	статически?	
•  Компилировать	каждый	класс	изолировано	от	
других	
–  Плохо	для	производительности	
•  Изучить	логику	разрешения	ссылок	для	
популярных	загрузчиков	
–  Не	работает	для	произвольных	загрузчиков	
20
Нестандартные	загрузчики	классов	
21
Classes	
Classe
s	Classes
Classes	
CL1	
CL2	
CL3	
CL4	
Нестандартные	загрузчики	классов	
22CLi: class loader
• CL4	• CL3	
• CL2	• CL1	
classes	 classes	
classes	classes	
Нестандартные	загрузчики	классов	
23
• CL4	• CL3	
• CL2	• CL1	
classes	
classes	
classes	classes	
Нестандартные	загрузчики	классов	
24
• CL4	• CL3	
• CL2	• CL1	
classes	 classes	
classes	classes	
Нестандартные	загрузчики	классов	
25
Нестандартные	загрузчики	классов	
26
• CL4	• CL3	
• CL2	• CL1	
classes	 classes	
classes
• CL4	• CL3	
• CL2	• CL1	
classes	 classes	
Нестандартные	загрузчики	классов	
27
Нестандартные	загрузчики	классов	
Схема	поддержки	загрузчиков	в	AOT:	
•  Компонента	разрешения	ссылок	в	AOT		
компиляторе:	
–  Определяет,	какие	загрузчики	будут	созданы	во	
время	исполнения	и	назначает	каждому	
статический	ID	
–  Разбивает	классы	приложения	по	загрузчикам		
–  Разрешает	ссылки	между	классами		
28
Нестандартные	загрузчики	классов	
Схема	поддержки	загрузчиков	в	AOT:	
•  Во	время	исполнения:	
–  По	экземпляру	загрузчика	вычисляется	ID	
–  Имея	статический	ID,	мы	можем	грузить	
статически	скомпилированные	классы:	
•  создание	экземпляра	класса	java.lang.Class	
•  наполнение	его	рефлективной	информацией	
•  загрузка	кода	осуществляется	OS	
29
Нестандартные	загрузчики	классов	
Схема	поддержки	загрузчиков	в	AOT:	
•  Во	время	исполнения:	
–  По	экземпляру	загрузчика	вычисляется	ID	
–  Имея	статический	ID,	мы	можем	грузить	
статически	скомпилированные	классы:		
		
							Как	минимум	работает	для	Eclipse	RCP	и		
							Web	приложений	на	базе	Tomcat		
30
Зачем	AOT	для	Java?	
31
Защита	кода	от	декомпиляции	
32
Защита	кода	приложения	
•  Java	bytecode	легко	превращается	в	исходный	
код	
•  Процесс	обфускации	при	активном	
использовании	reflecron	трудоемок	и	трудно	
поддерживаем	
•  Даже	по	обфусцированному	коду	часто	
можно	понять,	что	код	делает		
–  ссылки	на	JDK	остаются	в	неизменном	виде	
33
Защита	кода	приложения	
•  Машинный	код	можно	только	эффективно	
дизассемблировать	
•  По	дизассемблированному	коду	не	понять	
структуру	приложения	(нет	имен	классов,	
методов)	
•  После	агрессивной	оптимизации	машинный	
код	далек	от	оригинального	кода	
34
Время	старта	приложения	
35
Холодный	старт	vs	теплый	
Во	второй	раз	приложение	стартует	
значительно	быстрее,	чем	в	первый	
–  Загрузка	кода	и	данных	приложения	с	диска	
–  Загрузка	системных	и	сторонних	динамических	
библиотек	(dll,	so)	
36
Java	Quick	Start	
	
•  Java	Quick	Start	
–  Предзагружает	rt.jar,	динамические	библиотеки	
37
AOT	быстрее?	
•  Машинный	код	“толще”	Java	bytecode	
•  Загрузка	кода	с	диска	занимает	больше	
времени,	чем	его	начальное	исполнение	
38
AOT	быстрее!	
•  Код	исполняемый	на	старте	–	в	начало	
исполняемого	файла		
•  Можно	предзагружать	стартовый	сегмент	
последовательным	чтением	
39
40
Производительность	
41
Миф	4.	AOT	быстрее	
	
	
		“Скомпилировав	Java	статически,	мы	
получим	скорость	приложения	как	в	C,	C		
быстрее	Java,		следовательно	AOT	быстрее”	
	
	 42
Миф	5.	JIT	быстрее	
	
	
“Эффективно	оптимизировать	Java	
приложения	можно	только	на	основе	
динамического	профиля	исполнения”		
	
43
Виды	оптимизаций	
–  Протяжка	констант	
–  Удаление	избыточного	кода	
–  Удаление	общих	
подвыражений	
–  Открытая	подстановка	
–  Специализация	методов	
–  Развертывание	циклов	
–  Версионирование	циклов	
–  Вынос	инвариантов	
–  Удаление	хвостовой	рекурсии	
–  Девиртуализация	вызовов	
–  Аллокация	объектов	на	
стэке	и	их	взрыв	
–  Удаление	проверок	
времени	исполнения	
–  Удаление	избыточной	
синхронизации	
–  Оптимальная	выборка	
кода	и	свертка	шаблонов	
–  Планировка	инструкций	
–  Оптимальное	
распределение	регистров	
44
Java	–	ООП	
• Много	методов	
• Методы	маленькие	(get/set)	
• Методы	по	умолчанию	ВИРТУАЛЬНЫЕ	
45
Девиртуализация	вызовов	
•  Предусловие	дальнейшей	открытой	подстановки	(inline)	
•  Анализ	иерархии	классов		
–  метод	не	перегружается	–	невиртуальный	
•  Типовый	анализ	
–  new T().foo(); //вызов foo()
// невиртуальный
•  Profile	guided	
46
A a;
…																									è	
	
a.foo();
	
if (RT_Type(a) in CHA) {
inlined body of foo()
} else {
a.foo();
}
Идея: метод не перегружается – невиртуальный
Анализ	иерархии	классов	(CHA)	
47
Формальный	vs	фактический	тип		
A a; //A – формальный тип
Если	A –	формальный	тип	переменой	a,		
то	во	время	исполнения	в	a	могут	находится	значения	типа	
наследника	A.			Такие	типы	называются	фактическими.	
A a = new B(); //B – фактический тип
	
Источником	фактических	типов	для	статического	анализа	являются	
операторы	new.		
48
Типовый	анализ	
Идея:		
new A().foo();	//невиртуальный	вызов		
	
49
Типовый	анализ	
A a = b? new B() : new C();
a.foo();
	
Если	foo()	в	B	и	С один	и	тоже,	то	
	
a.foo() невиртуальный	вызов		
																		(можно	инлайнить)	
50
Типовый	анализ	
A a = b? bar() : baz();
…
a.foo();
	
Если	bar() возвращает	только	new B,			
						а	baz()																экземпляры	new С,	то	
	
a.foo() - опять	невиртуальный	вызов		
																										(можно	инлайнить)	
51
Типовый	анализ	
	
	
Откуда	мы	знаем,	что	возвращает	bar() и	
baz()?	
52
Глобальный	анализ	
•  Глобальный	анализ	–	анализирует	все	
методы	программы,	вычисляя	про	каждый	
метод	полезную	информацию		
•  Результаты	глобального	анализа	
используются	для	оптимизации	
конкретного	метода			
53
Аллокация	объектов		
на	стэке	
•  Все	Java	объекты	создаются	в	динамической	
памяти	–	Java	heap	(куча)	
•  Большинство	объектов	временные	
•  Хочется	их	размещать	на	стэке	метода	
Escape	анализ	(анализ	утечек)	–	определяет	
утекает	ли	объект	в	разделяемую	память.	
54
Пример		
for (Object o: getCollection()) {
doSomething(o);
}
55
Пример		
Iterator iter = getCollection().iterator();
while (iter.hasNext()) {
Object o = iter.next();
doSomething(o);
}
56
Пример		
Допустим	анализ	показал,	что	getCollection()
всегда	возвращает	экземпляр	ArrayList
ArrayList list = getCollection();
Iterator iter = list.iterator();
while (iter.hasNext()) {
Object o = iter.next();
doSomething(o);
}
57
Пример		
ArrayList list = getCollection();
ArrayList.ListItr iter = new ListItr(list);
while (iter.hasNext()) {
Object o = iter.next();
doSomething(o);
}
58
Пример		
ArrayList list = getCollection();
ArrayList.ListItr iter = onStack ListItr();
iter.this$0 = list;
iter.cursor = 0;
iter.size = list.elemData.length;
while (iter.hasNext()) {
Object o = iter.next();
doSomething(o);
}
59
Пример		
ArrayList list = getCollection();
ArrayList.ListItr iter = onStack ListItr(list);
iter.this$0 = list;
iter.cursor = 0;
iter.size = list.elemData.length;
while (iter.cursor < iter.size) {
int index = iter.cursor++;
Object o = iter.this$0.elemData[index];
doSomething(o);
}
60
Пример		
ArrayList list = getCollection();
int cursor = 0;
int size = list.elemData.length;
while (cursor < size) {
Object o = list.elemData[cursor++];
doSomething(o);
}
61
Пример		
ArrayList list = getCollection();
int size = list.elemData.length;
for (int i = 0; i < size; i++) {
doSomething(list.elemData[i]);
}
62
•  Часто	бывают	довольно	сложными		
•  Требуют	итеративного	пересчета	
•  Глобальный	анализ	зависит	от	ВСЕЙ		
программы.	
Все	ли	это	может	
себе	позволить	JIT?	
Анализ	и	оптимизации	
63
•  Часто	бывают	довольно	сложными		
•  Требуют	итеративного	пересчета	
•  Глобальный	анализ	зависит	от	ВСЕЙ		
программы.	
Все	ли	это	может	
себе	позволить	JIT?	
Анализ	и	оптимизации	
64
•  Часто	бывают	довольно	сложными		
•  Требуют	итеративного	пересчета	
•  Глобальный	анализ	зависит	от	ВСЕЙ		
программы.	
Все	ли	это	может	
себе	позволить	JIT?	
Анализ	и	оптимизации	
65
Динамические	оптимизации	
•  Профилировка	и		селективная	компиляция	
•  Открытая	подстановка	на	основе	профиля	
исполнения		
•  Оптимизация	трасс	исполнения	
•  Выбор	оптимальных	инструкций	
66
Горячий	код	vs	теплый	
Q:	А	что	будет,	если	у	приложения	нет	ярко	
выраженного	горячего	кода?	
A:	Долгий	прогрев,	результаты	прогрева	не	
используются	при	дальнейших	стартах	
приложения	
	
Типичный	случай:	UI	приложения	
67
JFCMark	(Short	Run)	
0%	
50%	
100%	
150%	
200%	
250%	
2	core	Celeron,	2.60Ghz	 4	core	i5,	3.8GZ	
Excelsior	JET	
HotSpot	client	
HotSpot	server	
68
JFCMark	(Long	Run)	
0%	
20%	
40%	
60%	
80%	
100%	
120%	
140%	
160%	
2	core	Celeron,	2.60Ghz	 4	core	i5,	3.8GZ	
Excelsior	JET	
HotSpot	client	
HotSpot	server	
69
Динамические	оптимизации	
	
Может	ли	статический	компилятор	
использовать	динамический	профиль	
исполнения?	
70
Server	side	
•  Процессорное	время	в	
	облаках	–	дорого		
•  Через	некоторое	время	работы	сервера	профиль	
исполнения	стабилизируется	
•  Почему	этот	профиль	не	передать	статическому	
компилятору?	
71
AOT	on	the	Server	side	
•  Стабильная	производительность,	предсказуемая	latency	
–  нет	деоптимизаций	во	время	исполнения	
•  Нет	прогрева,	работает	в	полную	силу	прямо	со	старта	
–  Хорошо	для	load	balancing	
•  Лучшее	время	старта	
–  хорошо,		когда	много	серверов	стартует	одновременно	
•  Все	еще	защищает	от	декомпиляции	
72
Embedded	
•  Чем	слабее	железо,	тем	дороже	
динамическая	компиляция	
•  Встроенные	системы	часто	не	обладают	
теми	же	вычислительными	мощностями,	
что	и	настольные	компьютеры/сервера		
73
Mobile	
•  JVM	on	Mobile:	
74
Mobile	
•  JVM	on	Mobile:	
– Платформенные	классы	
75
Mobile	
•  JVM	on	Mobile:	
– Платформенные	классы	
– GC	и		Memory	Manager	
76
Mobile	
•  JVM	on	Mobile:	
– Платформенные	классы	
– GC	и		Memory	Manager	
– Reflecron	
77
Mobile	
•  JVM	on	Mobile:	
– Платформенные	классы	
– GC	и		Memory	Manager	
– Reflecron	
– JIT	
78
Mobile	
•  JVM	on	Mobile:	
–  Платформенные	классы	
–  GC	и		Memory	Manager	
–  Reflecron	
–  JIT	
Чего	не	хватает?	
79
Mobile	
•  JVM	on	Mobile:	
–  Платформенные	классы	
–  GC	и		Memory	Manager	
–  Reflecron	
–  JIT	
Зарядки!	
	
80
Mobile	
•  У	беспроводных	устройств	есть	БАТАРЕЙКА	
	
•  Стоит	ли	ее	тратить	на		
				динамическую	компиляцию?	
81
iOS	
•  Политика	распространения	приложений	на	
iOS	запрещает	любую	динамическую	
загрузку	кода	
•  Для	Java	возможен	либо	интерпретатор,	
либо	AOT			
82
AOT	Java	Compilers	in	2000	
Desktop/Server:	
BulletTrain	
Excelsior	JET	
GNU	Compiler	for	Java	(GCJ)	
IBM	VisualAge	for	Java	
Supercede/JOVE	
TowerJ	
Embedded/Mobile:	
Diab	FastJ	
Esmertec	Jbed	ME	
GCJ		
IBM	J9	
Sun	Java	ME		
(custom	offerings)	
	
	 83
AOT	Java	Compilers	in	2017	
Desktop/Server:	
Excelsior	JET	
GCJ	(RIP)	
IBM	Java	SDK	for	AIX	
IBM	Java	SDK	for	z/OS	
	
Coming	soon:	
HotSpot	AOT	(JEP-295)	
Embedded/Mobile:	
Excelsior	JET	Embedded	
IBM	WebSphere	Real	Time	
Oracle	Java	ME	Embedded	Client	
Codename	One	
Avian	
Android	ART	
RoboVM	(RIP)	
Mulr-OS	Engine	
84
AOT	Java	Compilers	in	2017	
Desktop/Server:	
Excelsior	JET	
GCJ	(RIP)	
IBM	Java	SDK	for	AIX	
IBM	Java	SDK	for	z/OS	
	
Coming	soon:	
HotSpot	AOT	(JEP-295)	
Embedded/Mobile:	
Excelsior	JET	Embedded	
IBM	WebSphere	Real	Time	
Oracle	Java	ME	Embedded	Client	
Codename	One	
Avian	
Android	ART	
RoboVM	(RIP)	
Mulr-OS	Engine	
85
Статическая	компиляция	Java	
приложений:	
86
Возможна
Статическая	компиляция	Java	
приложений:	
87
Возможна
С сохранением всех Java фич
Полезна по многим причинам
Статическая	компиляция	Java	
приложений:	
88
Возможна
С сохранением всех Java фич
Полезна по многим причинам
Вопросы и ответы
Никита Липский,
Excelsior
nlipsky@excelsior-usa.com
twitter: @pjBooms 89
Ускорение	приложений	
90

More Related Content

What's hot

Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"Yulia Tsisyk
 
Unsafe: to be or to be removed?
Unsafe: to be or to be removed?Unsafe: to be or to be removed?
Unsafe: to be or to be removed?Alexey Fyodorov
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013ScalaNsk
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerAnton Arhipov
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
 
Scala: что, как и зачем?
Scala: что, как и зачем?Scala: что, как и зачем?
Scala: что, как и зачем?Roman Timushev
 
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013Vladimir Ivanov
 
Tech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция JavaTech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция JavaTech Talks @NSU
 
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Nikita Lipsky
 
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)ScalaNsk
 
Клиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на JavaКлиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на JavaNikita Lipsky
 
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)aragozin
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммыPlatonov Sergey
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаSergey Platonov
 
Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)Victor_Cr
 
Статический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокСтатический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокAndrey Karpov
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 

What's hot (20)

In the sun.misc.Unsafe bowels
In the sun.misc.Unsafe bowelsIn the sun.misc.Unsafe bowels
In the sun.misc.Unsafe bowels
 
Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"
 
Unsafe: to be or to be removed?
Unsafe: to be or to be removed?Unsafe: to be or to be removed?
Unsafe: to be or to be removed?
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
 
Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кода
 
Scala: что, как и зачем?
Scala: что, как и зачем?Scala: что, как и зачем?
Scala: что, как и зачем?
 
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
 
Tech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция JavaTech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция Java
 
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
 
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
 
Клиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на JavaКлиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на Java
 
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 
Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)
 
Статический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокСтатический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибок
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 

More from 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
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilationNikita Lipsky
 
Excelsior JET в действии
Excelsior JET в действииExcelsior JET в действии
Excelsior JET в действии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
 
Java худеет. Спроси меня как.
Java худеет. Спроси меня как.Java худеет. Спроси меня как.
Java худеет. Спроси меня как.Nikita Lipsky
 
История одной JVM в картинках
История одной JVM в картинкахИстория одной JVM в картинках
История одной JVM в картинкахNikita Lipsky
 

More from Nikita Lipsky (14)

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
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilation
 
Excelsior JET в действии
Excelsior JET в действииExcelsior JET в действии
Excelsior JET в действии
 
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?Веб 3.0. Есть ли будущее у Java в RIA и Mobile?
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?
 
Занимательные истории из жизни технической поддержки JVM
Занимательные истории из жизни технической поддержки JVMЗанимательные истории из жизни технической поддержки JVM
Занимательные истории из жизни технической поддержки JVM
 
Неумолимая близость десктопа, веба и мобайла
Неумолимая близость десктопа, веба и мобайлаНеумолимая близость десктопа, веба и мобайла
Неумолимая близость десктопа, веба и мобайла
 
Java худеет. Спроси меня как.
Java худеет. Спроси меня как.Java худеет. Спроси меня как.
Java худеет. Спроси меня как.
 
История одной JVM в картинках
История одной JVM в картинкахИстория одной JVM в картинках
История одной JVM в картинках
 

AOT для Java: Мифы и Challenges