There are hundreds of JVM parameters and options out there. Here we are going to take a closer look at the internal structure of HotSpot VM while over-viewing memory spaces and different types of Garbage Collectors.
2. О чем пойдет речь
•Рассмотрение с точки зрения Java программиста
•Для других программистов и системных
администраторов
•Внутренняя организация памяти JVM
3. Содержание
•Базовые сведения про Garbage Collector
•Исключительные ситуации OutOfMemory
–Почему они произошли
–Как их исправить
•Некоторые опции для тюнинга VM
•Вопросы и ответы
•Распределение памяти внутри Java machine
4. •Каждый процесс управляет памятью
•Способы управления памятью в процессе
o C (malloc() и free())
o C++(new и delete)
o Java(new и GC)
•Запускается как отдельный процесс (память между процессами не разделяется)
6. Замечание
Опции -Xmx, -Xms и –Xmn влияют только на размер «кучи» Java объектов, но не кучи
самого Java процесса – непонимание этого факта может повлечь неправильное
конфигурирование.(И как результат – ухудшение общей производительности )
10. Переполнение PermGen
•Библиотеки неявно генерирующие байткод
•Использование java.lang.reflect.Proxy
•Java Reflection API
•Serialization
•RMI
•Библиотеки явно генерирующие байткод
11. Java Thread Stack
•Память выделяется каждому созданному потоку в
индивидуальное пользование.
•Хранится стек вызова методов, локальные
переменные и параметры.
o Локальная переменная примитивного типа -
все данные полностью хранятся на стеке.
o Объект - ссылка хранится на стеке, сам же
объект уже создается в куче.
12. Размеры объектов в памяти
(примитивные типы)
Java types bytes required
boolean
1
byte
char
2
short
int
4
float
long
8
double
13. Размеры объектов в памяти
•Обычные объекты занимают минимум 8байт
(служебная информация)
•Массивы занимают минимум 12 байт (8 как
обычный объект и 4 - размер массива)
•Для каждого объект производится выравнивание
по границе 8байт
14. Размеры объектов в памяти
• Объект с полем типа char занимает 16 байт
Заголовок 8 байт + поле 1 байт + выравнивание 7 байт
• Объект с 8 полями типа char занимает 16 байт
Заголовок 8 байт + 8 полей по 1 байт
• Массив 10x10 int занимает 616 байт
Внешний массив - 52 (после паддинга 56 байт)+
10 внутренних массивов по 56 байт(52 байта до выравнивания)
15. История Garbage Collector
• Механизм GC был впервые использован Джоном
Маккарти в языке LISP (1959).
• В последствии часто применялся в
функциональных и логических ЯП.
• С 1980-х годов технология сборки мусора стала
использоваться и в директивных, и в объектных
языках программирования
16. Немного теории
Сборщики мусора используют консервативные
оценки, позволяющие определить, что в будущем
объект гарантированно не будет использоваться.
Обычно критерием того, что объект ещё
используется, является наличие ссылок на него.
Если в системе нет больше ссылок на данный
объект, то он больше не может быть использован
программой и может быть удалён. Этот критерий
используется большинством современных
сборщиков мусора и называется ещё
достижимостью объекта.
17. Еще немного теории - Алгоритм
«Mark and sweep»
• для каждого объекта есть флаг, указывающий,
достижим ли этот объект из программы или нет;
• изначально все объекты, кроме корневых,
помечаются как недостижимые;
• рекурсивно просматриваются и помечаются как
достижимые объекты ещё не помеченные и до
которых можно добраться из корневых объектов
по ссылкам;
• те объекты, у которых флаг достижимости не
был установлен, считаются недостижимыми.
18. Ближе к практике – Фазы GC
• Lock it down
o Все объекты должны быть заблокированы,
что бы они не изменились в процессе сборки
мусора
• Mark
o Пройтись по всем объектам
o Отметить недостижимые как «мусор»
• Sweep
o Удалить отмеченные объекты
o Освободить память
19. Стратегии GC
• Stop The World
• Incremental
o Отложить GC до окончания создания новых
объектов
• Concurrent/Parallel
o Выделение памяти происходит совместно с
GC
o Очень сложные режимы блокировок
o Поколения объектов
• CMS – Concurrent Mark and Sweep
23. Как это работает
1. Создается новый объект
2. Если Eden переполнен – минорная сборка
3. Выжившие объекты копируются в 1st survivor
space
4. Следующий раз при заполнении Eden
• Копируются из Eden в 2nd
• Копируются из 1st в 2nd
5. Если 2nd заполнен и объекты все еще остаются
в Eden или в 1st
o Копируются в tenured
24. Рекомендуемые опции GC
Установки GC
-XX:+UseConcMarkSweepGC
-XX:+CMSIncrementalMode
-XX:+CMSIncrementalPacing
-XX:CMSIncrementalDutyCycleMin=0
-XX:+CMSIncrementalDutyCycle=10
-XX:+UseParNewGC
-XX:+CMSPermGenSweepingEnabled
Для анализа того, что происходит
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:-TraceClassUnloading