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

JVM Internals and Garbage Collectors

JVM Internals and Garbage Collectors

How JMV works and what garbage collectors do we have in 2019

nikolai.smirnov

November 15, 2019
Tweet

More Decks by nikolai.smirnov

Other Decks in Education

Transcript

  1. Обо мне • Java-программист с 2007 г. • Преподаватель курса

    «Технологии разработки качественного ПО» с 2018 г. (ИКНТ) • Руководитель группы автоматизации тестирования отдела Платформы http://bercut.com 2
  2. План • Как устроена JVM • Структура памяти Java-приложения •

    Принципы работы GC • Сравнение сборщиков мусора в JVM 3
  3. Что такое JVM? • Абстракция над вычислительной машиной • Часть

    JRE (Runtime Environment) • Исполнитель bytecode • Менеджер памяти • Определяется спецификацией [1] 4
  4. ClassLoader • Loading .class -> method area + Class<T> •

    Linking: verify, allocate, resolve refs • Initialization: static context 9 App CL Ext CL Bootstrap CL JAVA_HOME/jre/lib/ext ClassPath CL 1 CL 1 CL X ClassNotFoundException
  5. Данные класса 10 Student s1 = new Student(); // Получение

    класс-объекта Class c1 = s1.getClass(); System.out.println("classname: " + c1.getName()); // получение всех методов (и приватных тоже) Method m[] = c1.getDeclaredMethods(); for (Method method : m) System.out.println(method.getName() + "()"); // получение всех полей (и приватных тоже) Field f[] = c1.getDeclaredFields(); for (Field field : f) System.out.println("field " + field.getName()); Вывод: classname: Student getName() setName() field name
  6. Execution Engine 11 Интерпретатор JIT компилятор Garbage Collector AOT компилятор

    Graal. Java 9 // stack=3, locals=1, args_size=1 // 0: getstatic // 3: new // 6: dup // 7: invokespecial // 10: ldc // 12: invokevirtual > javap –v *.class
  7. Как в C/C++? • Free() – обязанность разработчика • 80%

    ошибок с продуктива – утечки памяти (мои наблюдения) 13
  8. PermGen -> Metaspace • До Java8 – PermGen: classes, internalized

    str • -XX:MaxPermSize=256m • С Java8: Metaspace • Native memory: unlimited by default • -XX:MaxMetaspaceSize=256m 23
  9. Типы сборок • Minor GC = YoungGen • Major GC

    = OldGen • Full GC = Full Heap GC 24 -XX:+PrintGCDetails
  10. Когда Java-объект == мусор? • Ссылка на объект = null

    • Ссылка на объект переприсвоена • Local var в завершенном методе • Объект входит в Island of Isolation 25
  11. -XX:+UseSerialGC • YoungGen – serial mark-copy • OldGen – serial

    mark-sweep-compact • «Stop the world» паузы при работе • Когда использовать: только для маленького хипа и машины с 1 CPU 26
  12. -XX:+UseParallelGC • YoungGen – parallel mark-copy • OldGen – parallel

    mark-sweep-compact • «Stop the world» паузы при работе • -XX:ParallelGCThreads=NNN • Когда использовать: для многоядерных машин 27
  13. -XX:+UseConcMarkSweepGC • Young – parallel mark-copy (stop-the-world) • Old –

    «почти» конкурентный mark-sweep • Нет стадии compact! • GC nThreads = ¼ nCores • Когда использовать: для многоядерных машин, когда нужны малые паузы (low latency)! 28
  14. Garbage First 30 • Default для Java9, есть в Java8

    • Когда использовать: на современных машинах – всегда.
  15. JEP 351: ZGC • 15% overhead • 10-20 ms pauses

    • Продукт Oracle • -XX:+UnlockExperimentalVMOptions • -XX:+UseZGC 36
  16. Как вызвать GC? • YAGNI (You Aren’t Gonna Need It)

    • В коде: System.gc(); • В коде: Runtime.getRuntime().gc(); • В консоли: jcmd <pid> GC.run • Через JVisualVM 37
  17. Деструктор в Java?! • protected void finalize() • Джошуа Блох

    «Effective Java»: “Методы finalize непредсказуемы, часто опасны и, как правило, не нужны… • Для тестов – норм 38
  18. Что мы узнали • Что у JVM под капотом •

    Алгоритм загрузки классов • Области памяти • JIT-компиляция • Когда какой сборщик мусора использовать • Алгоритмы сборки мусора • Как писать код, чтобы мусор собирался 39
  19. Ссылки 1. Java Language and Virtual Machine Specifications – https://docs.oracle.com/javase/specs

    2. Java Virtual Machine (JVM) & its Architecture – https://www.guru99.com/java- virtual-machine-jvm.html 3. Gaurav Miglani. How JVM Works – JVM Architecture? – https://www.geeksforgeeks.org/jvm-works-jvm-architecture/ 4. Джошуа Блох. Effective Java – http://diggerdnepr.ddns.net/wp- content/uploads/2019/05/blokh_dzh_- _java_effektivnoe_programmirovanie_2_izdanie_-_2008.pdf 5. Laszlo Nardai. Java Version Upgrades: GC Overview. – https://dzone.com/articles/java-version-upgrades-gc-overview 6. Шипилёв Алексей. Shenandoah GC: сборщик мусора, который смог – https://shipilev.net/talks/jpoint-April2017-shenandoah.pdf 7. Garbage Collection in Java – https://plumbr.io/handbook/garbage-collection-in- java 40