An internal look at HotSpot JVM
-
Upload
ecommerce-solution-provider-sysiq -
Category
Documents
-
view
480 -
download
5
description
Transcript of An internal look at HotSpot JVM
INSIDE THE JAVA VIRTUAL MACHINE
Управление памятью и решение типичных проблем
•Рассмотрение с точки зрения Java программиста
•Для других программистов и системных администраторов
•Внутренняя организация памяти JVM
О чем пойдет речь
•Базовые сведения про Garbage Collector
•Исключительные ситуации OutOfMemory
–Почему они произошли
–Как их исправить
•Некоторые опции для тюнинга VM
•Вопросы и ответы
•Распределение памяти внутри Java machine
Содержание
•Каждый процесс управляет памятью
•Способы управления памятью в процессеo C (malloc() и free())o C++(new и delete)o Java(new и GC)
•Запускается как отдельный процесс (память между процессами не разделяется)
The JVM Process Heap
Опции -Xmx, -Xms и –Xmn влияют только на размер «кучи» Java объектов, но не кучи самого Java процесса – непонимание этого факта может повлечь неправильное конфигурирование.(И как результат – ухудшение общей производительности )
Замечание
Структура памяти JVM процесса(для 32бит)
• java.lang.OutOfMemoryError: Java heap space
• java.lang.OutOfMemoryError: PermGen space
• java.lang.OutOfMemoryError: GC overhead limit exceeded
• java.lang.OutOfMemoryError: unable to create new native thread
Исключительные ситуации
•Class data sharing (CDS)-Xshare:off
-Xshare:on
-Xshare:auto
•String pool•Метаданные об объектах
Permanent Generation
•Библиотеки неявно генерирующие байткод
•Использование java.lang.reflect.Proxy
•Java Reflection API
•Serialization
•RMI
•Библиотеки явно генерирующие байткод
Переполнение PermGen
•Память выделяется каждому созданному потоку в индивидуальное пользование.
•Хранится стек вызова методов, локальные переменные и параметры.
o Локальная переменная примитивного типа - все данные полностью хранятся на стеке.
o Объект - ссылка хранится на стеке, сам же объект уже создается в куче.
Java Thread Stack
Размеры объектов в памяти(примитивные типы)
Java types bytes required
boolean1
byte
char2
short
int4
float
long8
double
Размеры объектов в памяти
•Обычные объекты занимают минимум 8байт (служебная информация)
•Массивы занимают минимум 12 байт (8 как обычный объект и 4 - размер массива)
•Для каждого объект производится выравнивание по границе 8байт
Размеры объектов в памяти
• Объект с полем типа char занимает 16 байт
Заголовок 8 байт + поле 1 байт + выравнивание 7 байт
• Объект с 8 полями типа char занимает 16 байт
Заголовок 8 байт + 8 полей по 1 байт
• Массив 10x10 int занимает 616 байт
Внешний массив - 52 (после паддинга 56 байт)+10 внутренних массивов по 56 байт(52 байта до выравнивания)
• Механизм GC был впервые использован Джоном Маккарти в языке LISP (1959).
• В последствии часто применялся в функциональных и логических ЯП.
• С 1980-х годов технология сборки мусора стала использоваться и в директивных, и в объектных языках программирования
История Garbage Collector
Сборщики мусора используют консервативные оценки, позволяющие определить, что в будущем объект гарантированно не будет использоваться.
Обычно критерием того, что объект ещё используется, является наличие ссылок на него. Если в системе нет больше ссылок на данный объект, то он больше не может быть использован программой и может быть удалён. Этот критерий используется большинством современных сборщиков мусора и называется ещё достижимостью объекта.
Немного теории
• для каждого объекта есть флаг, указывающий, достижим ли этот объект из программы или нет;
• изначально все объекты, кроме корневых, помечаются как недостижимые;
• рекурсивно просматриваются и помечаются как достижимые объекты ещё не помеченные и до которых можно добраться из корневых объектов по ссылкам;
• те объекты, у которых флаг достижимости не был установлен, считаются недостижимыми.
Еще немного теории - Алгоритм «Mark and sweep»
• Lock it downo Все объекты должны быть заблокированы,
что бы они не изменились в процессе сборки мусора
• Marko Пройтись по всем объектамo Отметить недостижимые как «мусор»
• Sweepo Удалить отмеченные объектыo Освободить память
Ближе к практике – Фазы GC
• Stop The World• Incremental
o Отложить GC до окончания создания новых объектов
• Concurrent/Parallelo Выделение памяти происходит совместно с
GCo Очень сложные режимы блокировокo Поколения объектов
• CMS – Concurrent Mark and Sweep
Стратегии GC
Стратегии GC
Стратегии GC
Поколения объектов в HotSpot
1. Создается новый объект
2. Если Eden переполнен – минорная сборка
3. Выжившие объекты копируются в 1st survivor space
4. Следующий раз при заполнении Eden• Копируются из Eden в 2nd• Копируются из 1st в 2nd
5. Если 2nd заполнен и объекты все еще остаются в Eden или в 1sto Копируются в tenured
Как это работает
Установки GC
-XX:+UseConcMarkSweepGC
-XX:+CMSIncrementalMode
-XX:+CMSIncrementalPacing
-XX:CMSIncrementalDutyCycleMin=0
-XX:+CMSIncrementalDutyCycle=10
-XX:+UseParNewGC
-XX:+CMSPermGenSweepingEnabled
Для анализа того, что происходит
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:-TraceClassUnloading
Рекомендуемые опции GC