84
AOT компиляция Java Никита Липский Excelsior 1

AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

AOT  компиляция  Java    

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

1

Page 2: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

ÄДàаâвíнûыìм äдàаâвíнîо  

2

Page 3: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

ÄДàаâвíнûыìм äдàаâвíнîо,

ÂВîо âвðрåеìмåеíнàа ÑС +++ ++++++  

3

Page 4: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

ÄДàаâвíнûыìм äдàаâвíнîо,

ÂВîо âвðрåеìмåеíнàа ÑС +++, ÂВñсåе êкîоìмïпèиëлÿяòтîоðрûы áбûыëлèи ñсòтàаòтèи÷чåеñсêкèиåе ++++++  

4

Page 5: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

ÏПîоêкàа íнåе ïпîоÿяâвèиëлàаñсüь..  

5

Page 6: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

ÏПîоêкàа íнåе ïпîоÿяâвèиëлàаñсüь

Java  

6

Page 7: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

•  Интерпретация  

•  Компиляция  в  машинный  код  и  исполнение  на  “железе”  

Исполнение    Java  байткода  JVM  

7

Page 8: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Трансляция  Java  to  Na@ve  

•  Динамическая  (Just-­‐In-­‐Time  –  JIT).    – Трансляция  происходит  во  время  исполнения  программы  

•  Статическая  (Ahead-­‐Of-­‐Time  –  AOT)  – Трансляция  происходит  до  исполнения  программы  

8

Page 9: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

9

Page 10: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Статическая  компиляция  Java  

•  Это  вообще  возможно?  –  Если  да,  то  при  каких  условиях  и  будет  ли  это  все  еще  называться  Java?  

•  Зачем  это  нужно?  –  Обфускация  vs.  статическая  компиляция  –  Старт  приложения  –  Уменьшение  размера  дистрибутива  Java  приложения  без  зависимостей  от  Java  

–  Производительность:  какие  преимущества  перед  JIT  компиляцией  

–  Почему  AOT  лучше  для  Desktop,  Embedded,  Mobile  –  Есть  ли  выгода  от  применения  AOT  на  server  side  

 

10

Page 11: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

11

Page 12: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Кому  нужен  AOT  для  Java?    

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

12

Page 13: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

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

компиляции  Java  

13

Page 14: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

•  Reflecron  

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

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

Миф  1.    Java  -­‐    «слишком»  динамическая    

14

Page 15: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

 WORA:  Write  Once  Run  Anywhere  (пиши  раз,  исполняй  везде)  

!=  BORA:  Build  Once?  (собирай  раз???  …)  

Миф  2.  AOT  компиляция  –    убийца  WORA  

15

Page 16: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

”Я  получу  (маленький)  исполняемый  файл,  который  будет  работать  без  JVM  (как  в  С)”  

 Но:  – Стандартные  классы?  –   GC,  reflecron?  

Миф  3.  AOT  =  маленький  Exe  

16

Page 17: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

 Тем  не  менее,  используя  AOT,  можно  получить    дистрибутив  Java  приложения  без  зависимостей  от  Java  значительно  меньший,  чем  размер  JRE:  

 “Javа  худеет”:    h�p://www.youtube.com/watch?v=CKWlp8UQQb4      

Миф  3.  AOT  =  маленький  Exe  

17

Page 18: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Java  «слишком»  динамическая  

18

Page 19: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

•  Переопределяют  умолчательную  логику  разрешений  ссылок  между  классами  

•  Уникальное  пространство  имен  

•  Позволяют  управлять  зависимостями,  решая  проблемы  JAR  hell  (OSGi,  Java  Module  System)  

•  Java  EE  сервера,  Eclipse  RCP,  плагины  

Нестандартные  загрузчики  классов  

19

Page 20: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Как  компилировать  статически?  •  Компилировать  каждый  класс  изолировано  от  других  – Плохо  для  производительности  

•  Изучить  логику  разрешения  ссылок  для  популярных  загрузчиков  – Не  работает  для  произвольных  загрузчиков  

Нестандартные  загрузчики  классов  

20

Page 21: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Нестандартные  загрузчики  классов  

Classes  

21

Page 22: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Classes  

CL1  CL2  CL3  CL4  

Нестандартные  загрузчики  классов  

CLi: classloader (загрузчик классов)

22

Page 23: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

•  CL4  •  CL3  

•  CL2  •  CL1  

classes   classes  

classes  classes  

Нестандартные  загрузчики  классов  

23

Page 24: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

•  CL4  •  CL3  

•  CL2  •  CL1  

classes  classes  

classes  classes  

Нестандартные  загрузчики  классов  

24

Page 25: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

•  CL4  •  CL3  

•  CL2  •  CL1  

classes   classes  

classes  classes  

Нестандартные  загрузчики  классов  

25

Page 26: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

–  Картинка  

•  CL4  •  CL3  

•  CL2  •  CL1  

classes   classes  

classes  

Нестандартные  загрузчики  классов  

26

Page 27: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

•  CL4  •  CL3  

•  CL2  •  CL1  

classes   classes  

Нестандартные  загрузчики  классов  

27

Page 28: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Схема  поддержки  загрузчиков  в  AOT:  •  Компонента  разрешения  ссылок  в  AOT    компиляторе:  –  Определяет  какие  загрузчики  будут  созданы  

во  время  исполнения  и  назначается  каждому  статический  ID  

–  Разбивает  классы  приложения  по  загрузчикам    –  Разрешает  ссылки  между  классами    

Нестандартные  загрузчики  классов  

28

Page 29: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Схема  поддержки  загрузчиков  в  AOT:  •  Во  время  исполнения:  

–  По  экземпляру  загрузчика  вычисляется  ID  –  Имея  статический  ID  мы  можем  грузить  

статически  скомпилированные  классы:  •  создание  экземпляра  класса  java.lang.Class  •  наполнение  его  рефлективной  информацией  •  загрузка  кода  осуществляется  OS  

Нестандартные  загрузчики  классов  

29

Page 30: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Зачем  AOT  для  Java?  

30

Page 31: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

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

31

Page 32: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

•  Java  bytecode  легко  превращается  в  исходный  код  

•  Процесс  обфускации  при  активном  использовании  reflecron  –  трудоемок  и  трудно  поддерживаем  

•  Даже  по  обфусцированному  коду  часто  можно  понять,  что  код  делает  (ссылки  на  JDK  остаются  в  неизменном  виде)  

Защита  кода  приложения  

32

Page 33: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

•  Машинный  код  можно  только  эффективно  дизассемблировать  

•  По  дизассемблированному  коду  не  понять  структуру  приложения  (нет  имен  классов,  методов)  

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

Защита  кода  приложения  

33

Page 34: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

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

34

Page 35: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

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

– Загрузка  кода  и  данных  приложения  с  диска  – Загрузка  системных  и  сторонних  динамических  библиотек  (dll,  so)  

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

35

Page 36: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

 Java  Quick  Start  

 

•  Java  Quick  Start  – Предзагружает  rt.jar,  динамические  библиотеки  

36

Page 37: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

AOT  быстрее?  

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

•  Загрузка  кода  с  диска  занимает  больше  времени,  чем  его  начальное  исполнение  

37

Page 38: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

AOT  быстрее!  

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

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

38

Page 39: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

39

Page 40: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Производительность  

40

Page 41: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

       “Скомпилировав  Java  статически  мы  получим  скорость  приложения  как  в  C,  C    быстрее  Java,    следовательно  -­‐-­‐  AOT  быстрее”  

   

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

41

Page 42: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

   

“Эффективно  оптимизировать  Java  приложения  можно  только  на  основе  динамического  профиля  исполнения”    

 

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

42

Page 43: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

–  Протяжка  констант  –  Удаление  избыточного  кода  –  Удаление  общих  подвыражений  

–  Открытая  подстановка  –  Специализация  методов  –  Развертывание  циклов  –  Версионирование  циклов  –  Вынос  инвариантов  –  Удаление  хвостовой  рекурсии  

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

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

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

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

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

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

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

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

43

Page 44: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Java  –  ООП  

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

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

• Методы  по  умолчанию  ВИРТУАЛЬНЫЕ  

44

Page 45: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

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

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

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

•  Inline  caches  

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

45

Page 46: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

A a; …                                                  è    

a.foo();  

if (RT_Type(a) in CHA) { inlined body of foo() } else { a.foo(); }

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

Анализ  иерархии  классов  (CHA)  

46

Page 47: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Идея:     new A().foo();  //невиртуальный  вызов      

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

47

Page 48: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

A a = b? new B() : new C(); a.foo();  Если  foo()  в  B  и  С один  и  тоже,  то    a.foo() невиртуальный  вызов                                        (можно  инлайнить)  

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

48

Page 49: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

A a = b? bar() : baz(); … a.foo();  Если  bar() возвращает  только  new B,                  а  baz()                                экземпляры  new С,  то    a.foo() - опять  невиртуальный  вызов                                                        (можно  инлайнить)  

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

49

Page 50: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

   Откуда  мы  знаем,  что  возвращает  bar() и  baz()?  

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

50

Page 51: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

•  Глобальный  анализ  –  анализирует  все  методы  программы,  вычисляя  про  каждый  метод  полезную  информацию    

•  Результаты  глобального  анализа  используются  для  оптимизации  конкретного  метода      

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

51

Page 52: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

•  Все  Java  объекты  создаются  в  динамической  памяти  –  Java  heap  (куча)  

•  Большинство  объектов  временные  •  Хочется  их  размещать  на  стэке  метода  

•  Escape  анализ  (анализ  утечек)  –  определяет  утекает  ли  объект  в  разделяемую  память.  

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

52

Page 53: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

void foo() { for (Object o: getCollection()) { doSomething(o);

} }

Пример    

53

Page 54: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

void foo() { Iterator iter = getCollection().iterator(); while (iter.hasNext()) { Object o = iter.next(); doSomething(o);

}

}

Пример    

54

Page 55: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

void foo() { ArrayList list = getCollection(); Iterator iter = list.iterator(); while (iter.hasNext()) { Object o = iter.next(); doSomething(o);

}

}

Пример    

55

Page 56: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

void foo() { ArrayList list = getCollection(); ArrayList.ListItr iter = new ListItr(list); while (iter.hasNext()) { Object o = iter.next(); doSomething(o);

}

}

Пример    

56

Page 57: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

void foo() { 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);

}

}

Пример    

57

Page 58: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

void foo() { 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);

}

}

Пример    

58

Page 59: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

void foo() { ArrayList list = getCollection(); int cursor = 0; int size = list.elemData.length; while (cursor < size) { Object o = list.elemData[cursor++]; doSomething(o); }

}

Пример    

59

Page 60: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

void foo() { ArrayList list = getCollection();

int size = list.elemData.length; for (int i = 0; i < size; i++) { doSomething(list.elemData[i]); } }

Пример    

60

Page 61: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

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

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

•  Глобальный  анализ  зависит  от  ВСЕЙ  программы.  

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

61

Page 62: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

•  Часто  бывают  довольно  сложными    •  Требуют  итеративного  пересчета  •  Глобальный  анализ  зависит  от  ВСЕЙ  программы.  

Все  ли  это  может  себе  позволить  JIT?  

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

62

Page 63: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

•  Часто  бывают  довольно  сложными    •  Требуют  итеративного  пересчета  •  Глобальный  анализ  зависит  от  ВСЕЙ  программы.  

Все  ли  это  может  себе  позволить  JIT?  

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

63

Page 64: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

•  Часто  бывают  довольно  сложными    •  Требуют  итеративного  пересчета  •  Глобальный  анализ  зависит  от  ВСЕЙ  программы.  

Все  ли  это  может  себе  позволить  JIT?  

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

64

Page 65: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

•  Профилировка  и    селективная  компиляция  

•  Открытая  подстановка  на  основе  профиля  исполнения    

•  Оптимизация  трасс    исполнения  

•  Выбор  оптимальных  инструкций  

Динамические  оптимизации  

65

Page 66: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

•  А  что  будет,  если  у  приложения  нет  ярко  выраженного  горячего  кода?  

•  Долгий  прогрев,  результаты  прогрева  не  используются  при  дальнейших  стартах  приложения  

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

66

Page 67: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

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

Динамические  оптимизации  

67

Page 68: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Server  side  

•  Процессорное  время  в    облаках  –  дорого    

•  Через  некоторое  время  работы  сервера  –  профиль  исполнения  стабилизируется  

•  Почему  этот  профиль  не  передать  статическому  компилятору?  

68

Page 69: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

•  Кроме  кода  приложения,  есть  еще  код  JVM  –  Управление  памятью  –  Сборка  мусора  –  Потоки  и  синхронизация  –  Обработка  исключительных  ситуаций  –  …  

•  Кроме  Java  кода,  есть  сторонний  код    –  Narve  методы  +  нативные  библиотеки  (в  т.ч.  ОС)  

Не  кодом  единым  …  

69

Page 70: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Embedded  

•  Чем  слабее  железо,  тем  дороже  динамическая  компиляция  

•  Встроенные  системы  часто  не  обладают  теми  же  вычислительными  мощностями,  что  и  настольные  компьютеры/сервера    

70

Page 71: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Mobile  

•  JVM  on  Mobile:  

71

Page 72: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Mobile  

•  JVM  on  Mobile:  – Платформенные  классы  

72

Page 73: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Mobile  

•  JVM  on  Mobile:  – Платформенные  классы  – GC  и    Memory  Manager  

73

Page 74: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Mobile  

•  JVM  on  Mobile:  – Платформенные  классы  – GC  и    Memory  Manager  – Reflecron  

74

Page 75: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Mobile  

•  JVM  on  Mobile:  – Платформенные  классы  – GC  и    Memory  Manager  – Reflecron  –  JIT  

75

Page 76: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Mobile  

•  JVM  on  Mobile:  – Платформенные  классы  – GC  и    Memory  Manager  – Reflecron  –  JIT  

Что  не  хватает?  

76

Page 77: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Mobile  

•  JVM  on  Mobile:  – Платформенные  классы  – GC  и    Memory  Manager  – Reflecron  –  JIT  

Зарядка!    

77

Page 78: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Mobile  

•  У  беспроводных  устройств  есть  БАТАРЕЙКА    •  Стоит  ли  ее  тратить  на  динамическую  компиляцию?  

78

Page 79: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

iOS  

•  Политика  распространения  приложений  на  iOS  запрещает  любую  динамическую  загрузку  кода  

•  Для  Java  возможен  либо  интерпретатор,  либо  AOT      

79

Page 80: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

AOT  компиляторы  для  Java  

GCJ Excelsior JET Android ART RoboVM Avian CodeNameOne IBM J9 Java ME

80

Page 81: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

81

Page 82: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

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

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

•  полезна    –  для  защиты  кода  –  быстрого  старта  –  лучшего  UX  –  улучшения  производительности  –  экономии  батарейки,  памяти,  диска  

Итоги  

82

Page 83: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

Вопросы и ответы

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

[email protected] twitter: @pjBooms

83

Page 84: AOT$компиляцияJava - Joker · Статическаякомпиляция Java$ • Это!вообще!возможно?! – Если!да,!то!при!каких!условиях!и!будет

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

84