Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JVM: краткий курс общей анатомии

JVM: краткий курс общей анатомии

Никита Липский, Владимир Парфиненко (Excelsior) рассказывают про анатомию JVM.

«Говоря о Java, мы обычно подразумеваем как минимум две вещи: JVM (виртуальную Java-машину) и Java-байткод, который исполняется на этой машине.

Внутреннее устройство JVM непростое, но очень важно понимать, из каких частей она состоит, какая часть за что отвечает и как это все вместе работает хотя бы в самых общих чертах. Эти знания помогут вам в понимании того, как работает ваша программа и как можно улучшить ее работу.

В этом докладе мы не будем лезть в кишки какой-то конкретной реализации JVM, однако мы покажем где у JVM в принципе расположены кишки, а также где находятся и для чего служат ее печень, сердце, почки, мозг и другие органы.»

Подробности на http://techtalks.nsu.ru

E51d363aa46f4d059d54a15e0bcd8e6f?s=128

Tech Talks @NSU

October 20, 2015
Tweet

Transcript

  1. JVM:%краткий%курс%% общей%анатомии% Никита&Липский& Владимир&Парфиненко& Excelsior&LLC&

  2. 2&

  3. 3&

  4. Никита%Липский% •  Более&20&лет&профессиональной&карьеры& •  Инициатор&проекта&Excelsior&JET&& – работал&над&проектом&более&16&лет& – как&идейный&вдохновитель& – как&компиляторный&инженер& – как&руководитель& – и&много&в&каких&еще&ролях&&&&

    •  &Open&source&проекты&WebFX&и&Java&ReStart&& – в&свободное&от&работы&время& •  twiber:&@pjBooms& 4&
  5. Владимир%Парфиненко% •  Менее&20&лет&профессиональной&карьеры& •  Один&из&разработчиков&Excelsior&JET&& – Программирую&компиляторы& •  Активно&учу&студентов&в&НГУ& •  twiber:&@cypok&

    5&
  6. План%доклада% •  Java&class&file&and&bytecode&& •  Classloading&engine& •  Execuwon&engine:&interpretators,&JIT,&AOT& •  Meta&informawon&access&subsystem:&reflecwon,&indy,&JNI& • 

    Threading,&excepwon&handling,&synchronizawon& •  Memory&management:&heap,&allocawon,&GC& •  Manageability&and&Monitoring& 6&
  7. Java%class%file%&%bytecode% 7&

  8. Java%class%file%% •  1&класс&<–>&1&классÜфайл& •  Constant&Pool&& – числа,&строки& – указатели&на&классы,&методы,&поля& •  Описание&класса& 8&

    – имя& – модификаторы& – супер&класс& – супер&интерфейсы& – поля& – методы& – атрибуты&
  9. Java%class%file% •  Поля,&методы&тоже&имеют&атрибуты&(например,&значения& константных&полей)& •  Главный&атрибут&метода&–&это&его&код:&Java&байтÜкод& 9&

  10. Java%bytecode% •  Массив&инструкций& •  Стэк&операндов&инструкций&метода& & •  Массив&локальных&переменных&(аргументы&метода,& локальные&переменные)& 10&

  11. Java%bytecode% Инструкция&берет&свои&операнды&со&стэка&&и&&кладет& результат&на&стэк.&Пример:& 11& 0: iload 3 // загрузить на

    стэк переменную #3! 2: bipush 5 // загрузить на стэк константу 5! 4: iadd! // сложить два операнда со стэка и загрузить
 // на стэк результат! 5: istore 4 // снять значение со стэка в переменную #4!
  12. JVM:%предисловие% 12&

  13. Программа%для%JVM% Любая&программа&исполняемая&на&JVM&имеет?& 13&

  14. Программа%для%JVM% Любая&программа&исполняемая&на&JVM&имеет:& •  main&класс& public static void main(String[] args)! • 

    сlasspath&–&список&директорий&и&архивов&(jar&файлов)& •  В&мире&веб&приложений&программа&для&JVM&–&это&веб&сервер& – Tomcat,&GlassFish&и&т.п.& 14&
  15. Java%RunOme% Для&исполнения&программы&на&JVM&одной&JVM&не&достаточно.& Нужен&Java&Runwme&Environment:& •  JVM& •  Платформенные&классы& –  core&классы&(j.l.Object,&j.l.String&и&т.д.)& – 

    Java&standard&APIs&(IO,&NET,&NIO,&AWT/Swing&и&т.д)&&&&& •  Реализация&нативных&методов&платформенных&классов&(OS& specific)& •  Вспомогательные&файлы&(описатели&временных&зон,&медиа& ресурсы&и&т.п.)& 15&
  16. Анатомия%JVM% 16& OS&+&CPU& Monitoring& & AOT& Bytecode& Classloading& engine& Bytecode&Verificawon&

    Execuwon&engine:& interpreter,&JIT& Threading& Synchronizawon& Meta& informawon& Memory&management,& Garbage&Collecwon& Nawve&methods&
  17. Classloading%engine% 17& OS&+&CPU& Monitoring& & AOT& Bytecode& Classloading& engine& Bytecode&Verificawon&

    Execuwon&engine:& interpreter,&JIT& Threading& Synchronizawon& Meta& informawon& Memory&management,& Garbage&Collecwon& Nawve&methods&
  18. Загрузка%классов% •  Где&JVM&берет&классы&для&исполнения:& – Из&Java&Runwme&(платформенные&классы)& – Из&classpath&приложения&& – АвтоÜсгенеренные&на&лету&(Proxy,&Reflecwon&accessors,&реализация& invoke&dynamic)& – Предоставленные&самим&приложением& 18&

  19. Загрузка%классов% •  Каждый&класс&грузится&какимÜто&загрузчиком&классов:& – Платформенные&классы&грузятся&bootstrap&загрузчиком& – Классы&из&classpath&приложения&–&&системным&загрузчиком& (AppClassLoader)&& – Классы&приложения&могут&создавать&свои&загрузчики,&которые& будут&грузить&классы&&& & &

    19&
  20. Загрузка%классов% •  Каждый&класс&грузится&какимÜто&загрузчиком&классов:& – Платформенные&классы&грузятся&bootstrap&загрузчиком& – Классы&из&classpath&приложения&–&&системным&загрузчиком& (AppClassLoader)&& – Классы&приложения&могут&создавать&свои&загрузчики,&которые& будут&грузить&классы&&& •  Загрузчик&классов&образует&уникальное&пространство&имен&

    классов& 20&
  21. Старт%JVM% •  Грузится&main&класс&системным&загрузчиком&(из&classpath& приложения)& – Провоцирует&загрузку&части&платформенных&классов&(core)& •  Исполняется&метод&main(String[]&args)& 21&

  22. Процесс%загрузки%класса%% (создание%класса)% •  Читается&class&file&& – Проверяется&корректность&формата&(может&выбросить& ClassFormatError)& •  Создается&ранÜтайм&представление&класса&в&выделенной& области&памяти&& – runwme&constant&pool&in&Method&Area&aka&Meta%Space&aka&

    Permanent&Generawon& •  Грузятся&суперкласс,&суперинтерфейсы& 22&
  23. Линковка% •  Верификация&байтÜкода& •  Подготовка& •  Разрешение&символьных&ссылок& 23&

  24. C:&StackOverflowError& A:&Программа&зациклится& B:&VerifyError& D:&БайтÜкод&не&исполнится& Что&произойдет&при&исполнении&этого&байтÜкода?&

  25. Верификация%байт]кода% •  Происходит&с&классом&один&раз& •  Проверка&корректности&инструкций&(корректности& переходов)& •  Проверка&выхода&за&пределы&стэка&операндов&и&локальных& переменных& • 

    Проверка&совместимости&типов& 25&
  26. Верификация%байт]кода% •  Верификация&методом&вывода&типов&(type&inference& verificawon)& – Потоковый&анализ:&итеративное&уточнение&типовой&информации& до&достижения&неподвижной&точки& •  Раздельная&(split)&верификация&(type&checking&verificawon)& – Неподвижная&точка&для&потокового&анализа&кодируется&внутрь& байтÜкода&специальным&атрибутом.&Т.о.&верификация&происходит&

    за&один&проход&&& 26&
  27. Ну%а%если%все]таки%запустить%без%верификации?% $ java -noverify test! ! # A fatal error

    has been detected by the Java Runtime Environment:! Exception in thread "main" java.lang.StackOverflowError! at test.foo(test.j)! at test.main(test.j:3)! #! # Internal Error (javaCalls.cpp:53), pid=8012, tid=16396! # guarantee(!thread->is_Compiler_thread()) failed: cannot make java calls from the compiler! #! # If you would like to submit a bug report, please visit:! # http://bugreport.java.com/bugreport/crash.jsp! ! 27&
  28. Разрешение%символьных%ссылок% Класс&может&иметь&ссылки&на&другие&классы&и&поля,&методы& других&классов& •  Ленивое&разрешение&& – ссылки&разрешаются&при&первом&доступе& •  Энергичное&разрешение& – разрешаются&все&ссылки&какие&возможно&& 28&

  29. Инициализация%класса% •  Вызов&статического&инициализатора&класса& •  Случается&при&first&use:& – new& – доступ&до&статического&поля& – вызов&статического&метода& •  Провоцирует&инициализацию&суперÜкласса&и&суперÜ

    интерфейсов&с&default&методами& 29&
  30. ExecuOon%engine% 30& OS&+&CPU& Monitoring& Bytecode& Classloading& engine& Execuwon&engine:& interpreter,&JIT& Threading&

    Synchronizawon& Meta& informawon& Memory&management,& Garbage&Collecwon& Nawve&methods& Bytecode&Verificawon& & AOT&
  31. Исполнение%Java%байт]кода% JVM&может&исполнять&байтÜкод&двумя&способам:& & •  Интерпретировать& •  Транслировать&в&машинный&код,&который&будет& исполняться&непосредственно&на&CPU&& 31&

  32. Интерпретатор% pc = 0;! do {! fetch opcode at pc;!

    if (operands) fetch operands;! execute the opcode;! calculate pc;! } while (there is more to do);! 32&
  33. Компиляторы% •  Неоптимизирующие& –  “что&вижу,&то&пою”& && •  Простые&оптимизирующие&(пример&HotSpot&Client)& –  Простое&внутреннее&представление&(IR)&

    –  Простые&оптимизации& –  Pros:&быстрая&компиляция&& •  Сложные&оптимизирующие&(пример&HotSpot&Server)& –  Сложный&IR,&более&мощные&оптимизации& –  Pros:&более&оптимальный&код& 33&
  34. •  Динамические&(JustÜInÜTime&–&JIT).&& – Трансляция&в&машинный&код&происходит&во&время& исполнения&программы& •  Статические&(AheadÜOfÜTime&–&AOT)& – Трансляция&происходит&до&исполнения&программы& 34& Компиляторы%

  35. Динамические%компиляторы%(JIT)% •  Работают&одновременно&с&исполняемой&программой& •  Компилируют&горячий&код& •  Горячий&код&вычисляется&с&помощью&динамического& профилировщика& •  Используют&информацию&времени&

    исполнения&для&оптимизаций& 35&
  36. Статические%компиляторы%(AOT)%% •  Не&ограничены&в&ресурсах&для&оптимизации&программ& •  Компилируют&каждый&метод&программы&применяя&самые& агрессивные&оптимизации& •  На&оптимизацию&не&тратятся&ресурсы&во&время&исполнения& программы&(быстрее&старт)& 36&

  37. Статические%компиляторы%(AOT)%%% Интересный%факт:% Во#время#работы#статически#скомпилированной#Java# программы#может#не#исполниться#ни#одного#Java#байт< кода.# & Вопрос:%а#где#JVM?#& 37&

  38. Meta%informaOon%subsystem% 38& OS&+&CPU& Monitoring& & AOT& Bytecode& Classloading& engine& Bytecode&Verificawon&

    Execuwon&engine:& interpreter,&JIT& Threading& Synchronizawon& Meta& informawon& Memory&management,& Garbage&Collecwon& Nawve&methods&
  39. ReflecOon% •  Позволяет&доступаться&до&классов,&полей,&методов&по& имени&из&Java&программы& •  Реализуется&в&JVM&через&доступ&в&Meta&space&& •  Ключевая&возможность&Java&для&многих&популярных& фреймворков&и&реализаций&языков&на&JVM&& 39&

  40. Method%Handles%and%% invokedynamic%(JSR]292,%indy)% •  Indy:&программируемый&вызов& – для&эффективной&реализации&динамических&языков&на&JVM& & •  MethodHandle&–&целевой&объект&вызова&через& invokedynamic&& – может&быть&доступом&к&полю,&методу&

    – комбинацией&других&MethodHandle& – может&использоваться&отдельно&от&indy:&Reflecwon&2.0& 40&
  41. Java%naOve%interface%(JNI)% •  Связывает&JVM&c&внешним&миром&(OS)& •  Си&интерфейс&к&JVM& –  Не&зависит&от&реализации&JVM& –  Используется&для&реализации&nawve&методов&на&языке&&С&(или&другом& системном&языке)&

    –  С&помощью&JNI&написаны&платформенноÜзависимые&реализации&& &&&&Java&SE&API:&IO,&NET,&AWT& •  Реализуется&в&JVM&как&доступ&к&Meta&space& 41&
  42. %Threading%and%synchronizaOon% 42& OS&+&CPU& Monitoring& & AOT& Bytecode& Classloading& engine& Bytecode&Verificawon&

    Execuwon&engine:& interpreter,&JIT& Threading& Synchronizawon& Meta& informawon& Memory&management,& Garbage&Collecwon& Nawve&methods&
  43. java.lang.Thread% •  Java&поток&мапируется&на&нативный&поток&в&соотношение&1Ü1& •  С&потоком&связана&память&используемая&для&локальных& переменных&и&стэка&операндов&методов&(фреймов&методов):& стэк&(stack)& –  Размер&стэка&–&параметр&JVM:&ÜXss& • 

    Имеет&информацию&о&стэке&вызовов&методов&потока&(stack& trace)& –  В&любой&момент&может&о&нем&рассказать& & 43&
  44. Обработка%исключений%% Знание&о&стэке&вызовов&помогает&в&обработке&исключений:& 44& method&7& throw& method&3& catch& method&6& .&.&.& method&2&

    .&.&.& method&3& catch& method&2& .&.&.& PC& PC& excepwon&caught&
  45. Потоки%и%Java%Memory%Model% 45& // Thread 1:! Shared.data = getData();! Shared.ready =

    true;! // Thread 2:! while (!Shared.ready) {! // wait! }! receivedData = Shared.data;!
  46. Потоки%и%Java%Memory%Model% •  Разделяемая&(shared)&память& – Объекты&создаваемые&в&одних&потоках&могут&быть&далее& доступны&из&других& •  Семантика&доступа&к&разделяемой&памяти&из&разных& потоков&описывается&в&Java&Memory&Model&(Java&Language& Specificawon)& – Семантика&нетривиальна&в&связи&с&тем,&что&порядок&выполнения&

    инструкций&в&методе&не&обязан&быть&линейным& 46&
  47. Синхронизация% •  Для&безопасного&доступа&к&разделяемой&памяти&между& потоками& •  В&наивной&реализации&используются&средства&ОС& – ОС&монитор&есть&в&каждом&Java&объекте&как&скрытое&поле&& •  Оптимизирована&когда&конкуренция&за&ресурс&происходит& много&реже,&чем&вход&в&synchronized&

    47&
  48. Memory%management% 48& OS&+&CPU& Monitoring& & AOT& Bytecode& Classloading& engine& Bytecode&Verificawon&

    Execuwon&engine:& interpreter,&JIT& Threading& Synchronizawon& Meta& informawon& Memory&management,& Garbage&Collecwon& Nawve&methods&
  49. Выделение%памяти% •  Реализация&оператора&new% •  Объекты&выделенные&с&помощью&оператора&new% располагаются&&в&т.н.&куче&(Java&heap)& •  Организация&Java&heap&JVMÜcпецифична& •  Разметка&(layout)&Java&объекта&тоже&JVM&специфична.&

    49&
  50. Java%heap% Внутренняя&топология&Java&кучи&сильно&зависит&от&алгоритма& GC.&В&разных&реализациях&может&делиться&на:& & •  Область&молодого&и&старого&поколения& •  Разбиваться&на&блоки& •  Большие&объекты&могут&управляться&особым&образом&

    50&
  51. Аллокация%объектов% •  Должна&быть&быстрой& – JVM&запрашивает&у&OC&память&не&под&один&объект,&а&сразу&на& много&& – Аллокация&методом&продвижения&границы& •  ПотокоÜбезопасной&(threadÜsafe),&но&при&этом& параллельной&(не&блокирующей)& – Thread&local&heaps:&каждый&поток&“грызет”&свой&кусок&памяти&

    51&
  52. Layout%Java%объекта% Не&специфицируется&JVM,&но&по&факту&требует:& •  Java&Object&header& – Указатель&на&класс& – Монитор&(lock)& – Idenwty&hashcode& – Флаги&для&GC& •  Поля&

    – Могут&быть&переупорядочены&из&соображений&экономии& размера,&выравнивания,&особенностей&целевой&архитектуры& 52&
  53. Сборка%мусора% 53&

  54. Сборка%мусора% 54&

  55. Что%такое%мусор?% 55&

  56. Что%такое%мусор?% 56&

  57. Что%такое%мусор?% 57&

  58. Что%такое%мусор?% 58&

  59. Мусор% Мусором&являются&объекты,&которые&не&могут& использоваться&программой& Вопрос:%А&какие&объекты&могут&использоваться?& & 59&

  60. Мусор% Мусором&являются&объекты,&которые&не&могут& использоваться&программой& & Вопрос:%А&какие&объекты&могут&использоваться?& & Ответ:%&Не&мусор!& % 60&

  61. Не%мусор% 1.  Объекты&в&статических&полях&классов& 2.  В&локальных&переменных& 3.  …&всё?& 61&

  62. Не%мусор% Object o = new Object();! ...! 62& GC&случился&здесь!&

  63. Не%мусор%2% 1.  Объекты&в&статических&полях&классов& 2.  &В&локальных&переменных& Доступных&из&фрейма&метода&(локальные&переменные&и& стэк&операндов)& & Какого&метода?& 63&

  64. Не%мусор% 64&

  65. Не%мусор%2%возвращается%% 1.  Объекты&в&статических&полях&классов& 2.  &В&локальных&переменных& Доступных&из&фрейма&метода&фреймов&методов& (локальные&переменные&и&стэк&операндов)&стэка&вызовов& всех&Java&потоков.& 3.  Объекты,&на&которые&ссылается&“не&мусор”&

    65&
  66. Корневое%множество%объектов% %(GC%roots)% 1.  Объекты&в&статических&полях&классов& 2.  Объекты&доступные&со&стэка&Java&потоков& 3.  &Объекты&из&JNI&ссылок&в&nawve&методах& 66&

  67. Не%мусор%3% Не&мусор&aka&живые#объекты&–&это:&& & 1.  Объекты&из&корневого&множества&& 2.  Объекты,&на&которые&ссылаются&живые&объекты& Все&остальное&–&мусор.& 67&

  68. Трассирующие%сборщики% •  MarkÜandÜsweep& – Помечает&живые&объекты&(mark),&“выметает”&(удаляет)&мусор& (sweep)& •  StopÜandÜcopy& – Копирует&живые&объекты&в&специальное&место&(copy)&& – Освободившиеся&место&(мусор&и&места&где&были&живые&объекты)& может&использоваться&для&новой&аллокации&

    68&
  69. Stop%the%World% •  Живые&объекты&определены&для&определенного&момента& исполнения&программы& – При&исполнении&множество&меняется& •  Чтобы&собрать&мусор&в&общем&случае&нужно&остановить& потоки,&чтобы&определить&где&мусор&(STW#пауза)& & 69&

  70. Stop%the%World% Одна&из&основных&задач&современных&сборщиков&мусора&–& это&уменьшение&времени&STW&паузы.&Методы&уменьшения:& •  Инкрементальный&& – &собирать&не&весь&мусор&в&паузе& •  Параллельный& – собирать&мусор&во&многих&потоках&в&паузе& • 

    Одновременный&(concurrent)& – собирать&мусор&одновременно&с&работой&программы&(не& останавливая&потоки)&& 70&
  71. Поколенная%сборка%мусора% Гипотеза%о%поколениях:%большинство#объектов#умирает# молодыми# % Поколенный&(generawonal)&GC:& •  частный&вид&инкрементального& •  во&время&т.н.&малых#сборок&удаляем&мусор&&среди&молодых& объектов&

    •  объекты,&пережившие&одну&или&несколько&сборок,& перемещаем&в&область&старого&поколения&& % 71&
  72. GC:%advanced%topics% •  Финализаторы%и%слабые%ссылки% •  GC&(safe)&points& •  Точные&vs.&консервативные&GC& •  Способы&борьбы&с&фрагментацией&кучи& • 

    Real&wme&GC& •  Class&GC& •  Базовые&алгоритмы&GC& •  Конкретные&реализации:& –  В&одной&HotSpot&JVM&пять(!)&разных&GC& 72&
  73. Manageability%&%Monitoring% 73& OS&+&CPU& Monitoring& & AOT& Bytecode& Classloading& engine& Bytecode&Verificawon&

    Execuwon&engine:& interpreter,&JIT& Threading& Synchronizawon& Meta& informawon& Memory&management,& Garbage&Collecwon& Nawve&methods&
  74. Manageability%&%Monitoring% JVM&знает&про&вашу&программу&всё:& •  про&все&загруженные&классы& •  про&все&живые&объекты& •  про&все&потоки& •  про&все&исполняемые&методы&потоков&

    Почему&бы&не&поделиться&с&вами&этой&информацией&во& время&исполнения?&& 74&
  75. Manageability%&%Monitoring% JVM&Tool&Interface&(JVM&TI):& •  отладчики&& •  профилировщики& Java&Management&Beans:& •  Инструменты&мониторинга&запущенных&приложений& – 

    JConsole,&JMX&console,&AMC&& –  Visual&VM& –  Java&Mission&Control& 75&
  76. Абстрактная%JVM% 76& OS&+&CPU& Monitoring& & AOT& Bytecode& Classloading& engine& Bytecode&Verificawon&

    Execuwon&engine:& interpreter,&JIT& Threading& Synchronizawon& Meta& informawon& Memory&management,& Garbage&Collecwon& Nawve&methods&
  77. Реализации%JVM% Совместимые&с&Java&SE&спецификацией:& •  Oracle&HotSpot&& •  Oracle&JRockit&(RIP)& •  IBM&J9& •  Excelsior&JET&

    •  Azul&(HotSpot&based,&но&свой&GC)& •  SAP,&RedHat&(свои&порты&HotSpot&на&разные&платформы)& 77&
  78. Заключение% •  JVM&сложная,&но&жутко&интересная&штука& •  Java&–&золотая&середина&современных&IT&технологий:& –  Подробно&специфицирована& –  Эффективность&помноженная&на&гибкость:&& • 

    типизированность&Java&байтÜкода&позволяет&его&транслировать&в&машинный&код& очень&эффективно& •  при&этом&reflecwon,&indy,&динамическая&загрузка&придает&платформе&высокую& гибкость&и&динамичность& •  Все&реализации&JVM&в&постоянном&развитии&на&острие&науки&и& технологий& 78&
  79. Хочешь%стать%JVM%инженером?% •  В&компании&Excelsior&есть&стажировка&для&студентов&НГУ& – research&and&development&in&Excelsior&Research&VM&& – пишите&письма&на&interns@excelsior.ru&& •  Актуальные&научные&проблемы&в&области&оптимизирующих& компиляторов,&сборки&мусора& •  Лучшие&дипломные&работы&на&потоке&

    – получают&золотые&медали&среди&дипломных&работ&России& – работы&мирового&уровня& 79&
  80. Вопросы и ответы Никита Липский, Excelsior nlipsky@excelsior-usa.com twitter: @pjBooms Владимир

    Парфиненко, Excelsior vparfinenko@excelsior-usa.com twitter: @cypok 80&