предисловие
Недавно я прочитал третье издание книги «Глубокое понимание виртуальной машины Java» и разобрался с некоторыми базовыми структурными схемами, которые относительно полны. Делайте заметки и учитесь вместе.
1. Диаграмма области данных времени выполнения виртуальной машины Java
счетчик команд
- Счетчик программ, который можно рассматривать как индикатор номера строки байт-кода, выполняемого текущим потоком.
- Это частный поток.
Стек виртуальной машины Java
- Частный поток, жизненный цикл такой же, как и у потока.
- При выполнении каждого метода создается «фрейм стека», который используется для хранения такой информации, как таблица локальных переменных (включая параметры), стек операндов, динамическая ссылка, выход из метода и так далее.
- В таблице локальных переменных хранятся различные базовые типы данных, такие как логические, байтовые, символьные, короткие и т. д.
собственный стек методов
- По сути, он похож на стек виртуальной машины, разница в том, что стек виртуальной машины обслуживает метод Java, выполняемый виртуальной машиной, а локальный стек методов обслуживает собственный метод.
куча Java
- Куча Java — это самая большая область памяти в памяти, управляемая виртуальной машиной Java, а также область памяти, совместно используемая различными потоками, создаваемая при запуске JVM.
- Его размер задается параметрами -Xms и -Xmx.-Xms — это минимальный объем памяти, запрашиваемый при запуске JVM, а -Xmx — максимальный объем памяти, на который может претендовать JVM.
область метода
- Он используется для хранения информации о классе, констант и статических переменных, загруженных виртуальной машиной, и представляет собой область памяти, совместно используемую каждым потоком. - Размер области метода может быть ограничен параметрами -XX:PermSize и -XX:MaxPermSize.
2. Карта распределения кучи по умолчанию
- Куча Java = старое поколение + молодое поколение
- Молодое поколение = Эдем + S0 + S1
- Соотношение по умолчанию между молодым поколением и старым поколением составляет 1:2, что можно настроить с помощью параметра –XX:NewRatio.
- По умолчанию Eden : from : to = 8 : 1 : 1 , что можно установить параметром –XX:SurvivorRatio
3. Структурная схема области метода
Область метода — это область памяти, совместно используемая каждым потоком, которая используется для хранения памяти, загруженной виртуальной машиной.Информация о типах, константы, статические переменные, кеш кода после своевременной компиляции компилятораданные.
4. Структура памяти объекта
Объект Java включен в память кучиЗаголовки объектов, данные экземпляра и заполнение3 части:
- Заголовок объекта включает в себя Mark Word (хранение хэш-кода, возраст генерации GC и т. д.) и указатель типа (указатель на метаданные типа объекта), а если это объект-массив, также есть место для сохранения длины множество
- Данные экземпляра — это эффективная информация, которую фактически хранит объект, включая все переменные-члены объекта, а их размер определяется размером каждой переменной-члена.
- Заполнение выравнивания не обязательно существует, оно действует только как заполнитель.
5. Отметьте диаграмму Word головы объекта
- Mark Word используется для хранения данных времени выполнения самого объекта, таких как хэш-код (HashCode), возраст генерации GC, флаги состояния блокировки, блокировки, удерживаемые потоками, смещенные идентификаторы потоков, смещенные временные метки и т. д.
- В 32-битной виртуальной машине HotSpot, если объект находится в разблокированном состоянии, 25 бит в 32-битном пространстве Mark Word используются для хранения хэш-кода объекта, 4 бита используются для хранения возраста создания объекта и 2 бита используются для хранения бита флага блокировки, 1 бит фиксируется на 0, что указывает на беспристрастную блокировку.
6. Структурная схема ассоциации объекта и монитора
Как объект связан с монитором?
Объект Java включает в себя заголовок объекта в памяти кучи, заголовок объекта имеет слово Mark, слово Mark хранит состояние блокировки, а указатель блокировки указывает на адрес монитора. Это на самом делеНижний слой синхронизированногоо~
7. Схема рабочего механизма Java Monitor:
Нижним уровнем синхронизации потоков Java является блокировка мониторинга Monitor~. Ниже представлена схема рабочего механизма Java Monitor:
- Чтобы получить поток монитора, он сначала войдет в очередь _EntryList.
- Когда поток получает монитор объекта, он входит в область _Owner, устанавливает его как текущий поток и увеличивает счетчик _count на 1.
- Если поток вызывает метод wait(), он войдет в очередь _WaitSet. Это снимет блокировку монитора, то есть присвоит _owner значение null, уменьшит _count на 1 и войдет в очередь _WaitSet для блокировки и ожидания.
- Если другой поток вызывает notify() / notifyAll() , он разбудит поток в _WaitSet, поток снова попытается получить блокировку монитора и в случае успеха войдет в область _Owner.
- После выполнения метода синхронизации поток выходит из критической секции, владелец монитора устанавливается равным нулю, а блокировка монитора снимается. .
8. Создайте блок-схему выделения памяти объекта
- Объекты обычно генерируются в районе Эдема.
- Если область Эдема заполняется, срабатывает Young GC.
- Когда срабатывает Young GC, область Eden очищается, а объекты, на которые нет ссылок, очищаются напрямую.
- Объекты, которые еще живы, будут отправлены в зону Выживших, Выживший =S0+S1.
- При каждом GC Young уцелевшие объекты копируются в неиспользуемую область Survivor, другая используемая в настоящее время область Survivor полностью очищается, а затем статус использования двух областей Survivor меняется.
- Если объект, который должен быть передан Young GC, больше, чем верхний предел области Survivor, объект сразу входит в старость.
- Объект не может все время оставаться в молодом поколении.Если он прошел несколько GC и все еще жив, и количество раз превышает порог -XX:MaxTenuringThreshold, он сразу переходит в старое поколение. Короче говоря, субъект много раз пережил катящуюся реку Янцзы, мир мира, и, наконец, стал старейшиной (вступая в старость)
9. Алгоритм анализа достижимости для определения выживания объекта
Алгоритм анализа достижимости используется для определения того, жив ли объект~
Основная идея алгоритма:
- Через серию объектов, называемых «GC Roots» в качестве отправной точки, поиск начинается с этих узлов в соответствии с эталонной связью, а путь поиска называется «ссылочной цепочкой». Когда объект подключается к GC Roots без какой-либо ссылки цепочка Когда (от GC Roots до этого объекта недоступен), это доказывает, что этот объект больше нельзя использовать.
10. Схематическая диаграмма алгоритма маркировки-развертки
- Алгоритм пометки-очистки — это самый простой алгоритм сборки мусора.
- Алгоритм разделен на две фазы: маркировку и очистку.
- Сначала отмечают объекты, которые необходимо переработать.После завершения маркировки помеченные объекты равномерно перерабатываются.
- Конечно, это можно изменить, сначала отмечая уцелевшие объекты и равномерно возвращая неотмеченные объекты.
- Два недостатка mark-sweep — нестабильная эффективность выполнения и фрагментация памяти.
11. Принципиальная схема алгоритма маркировки-копии
- В 1969 году Фенихель предложил «полублочную репликацию», которая делила объем памяти на две равные части и использовала только один блок за раз. Когда этот блок памяти будет израсходован, скопируйте уцелевшие объекты в другой блок, а затем за один раз очистите используемое пространство памяти~
- В 1989 году Эндрю Аппель предложил «переработку в стиле Аппеля», которая разделила новое поколение на более крупный Эдем и два меньших пространства для выживших. Для каждого выделения памяти используются только Eden и одно из пространств Survivor. Когда происходит сборка мусора, объекты, которые все еще живы в Eden и Survivor, одновременно копируются в другую часть пространства Survivor. Соотношение Эдема и Выжившего 8:1~
- Недостаток «репликации половинной области» в том, что она тратит впустую свободное пространство, и если выживаемость объекта высока, количество репликаций будет увеличиваться, а эффективность будет снижаться.
12. Принципиальная схема алгоритма сортировки по меткам
- В 1974 году Эдвард предложил алгоритм "отметка-очистка". Процесс маркировки такой же, как и алгоритм "отметка-очистка". Затем все уцелевшие объекты перемещаются в один конец пространства памяти, а затем память за границей очищается. прямо почистил~
- Существенное различие между алгоритмом маркировки-очистки и алгоритмом сортировки меток заключается в том, что первый является алгоритмом немобильной переработки, а второй — мобильным алгоритмом утилизации.
- Есть преимущества и недостатки перемещения уцелевших объектов.Хотя восстановление памяти сложно, но это более рентабельно с точки зрения производительности программы, выделение памяти сложнее, когда не перемещается, но время паузы сборки мусора будет короче, поэтому это зависит от выбора коллекционера. ~
- Сборщик Parallel Scavenge основан на алгоритме маркировки для сопоставления из-за того, что основное внимание уделяется пропускной способности. Сборщик CMS основан на алгоритме маркировки и очистки, поскольку он связан с задержкой.
13. Комбинированная схема сборщика мусора
- Коллекционеры нового поколения: Serial, ParNew, Parallel Scavenge
- Сборщики старого поколения: CMS, Serial Old, Parallel Old
- Гибридный коллектор: G1
14. Диаграмма жизненного цикла класса
Класс начинается с загрузки в память виртуальной машины и заканчивается выгрузкой из памяти Этот жизненный цикл прошел семь этапов: загрузка, проверка, подготовка, синтаксический анализ, инициализация, использование и выгрузка.
Стадия загрузки:
- Получите двоичный поток байтов, определяющий этот класс по его полному имени.
- Преобразуйте статическую структуру хранения, представленную этим потоком байтов, в структуру данных времени выполнения области метода.
- Создайте объект java.lang.Class, представляющий этот класс в памяти в качестве записи доступа к различным данным этого класса в области методов.
проверять:
- Цель проверки — убедиться, что информация, содержащаяся в потоке байтов файла Class, удовлетворяет ограничениям, и гарантировать, что эти коды не будут угрожать безопасности самой виртуальной машины при работе.
- Этап проверки включает в себя: проверку формата файла, проверку метаданных, проверку байт-кода и проверку ссылки на символ.
Подготовить
- Фаза подготовки — это фаза, на которой формально выделяется память для переменных (статических переменных), определенных в классе, и устанавливаются начальные значения переменных класса.
Разобрать
- Фаза разрешения — это процесс, посредством которого виртуальная машина заменяет символические ссылки в пуле констант прямыми ссылками.
инициализация
- На этапе инициализации фактически выполняется байт-код Java, определенный в классе.
15. Диаграмма модели родительского делегирования загрузчика классов
Состав модели родительского делегирования
Загрузчик классов запуска, загрузчик классов расширений, загрузчик классов приложений, пользовательский загрузчик классов
Рабочий процесс родительской модели делегирования:
Если загрузчик класса получает запрос на загрузку класса, он не будет пытаться загрузить сам класс в первую очередь, а делегирует запрос загрузчику родительского класса. Это верно для каждого загрузчика классов, только если родительский загрузчик не может найти указанный класс в своей области поиска (например, ClassNotFoundException), дочерний загрузчик попытается загрузить его сам.
Зачем нужна модель родительского делегирования?
Если нет родительского делегирования, может ли пользователь определить класс с тем же именем, что и java.lang.Object и java.lang.String, и поместить его в ClassPath, тогда результат сравнения между классами и уникальность класса Пол не гарантируется, поэтому модель родительского делегирования предотвращает появление в памяти нескольких копий одного и того же байт-кода.
16. Схема концептуальной структуры кадра стека
Фрейм стека — это структура данных, используемая для поддержки виртуальной машины при вызове и выполнении метода. Фрейм стека хранит таблицу локальных переменных метода, стек операндов, динамическую ссылку и информацию об адресе возврата метода.
таблица локальных переменных
- Это место для хранения группы значений переменных, которое используется для хранения параметров метода и локальных переменных, определенных внутри метода.
- В качестве минимальной единицы емкости таблицы локальных переменных используется слот переменной (Variable Slot).
стек операндов
- Стек операндов, также известный как стек операндов, представляет собой стек «последний пришел — первый ушел».
- Когда метод только начинает выполняться, стек операндов метода также пуст.Во время выполнения метода будут различные инструкции байт-кода для записи и извлечения содержимого в стек операндов, то есть операции pop и Push.
динамическая ссылка
- Каждый фрейм стека содержит ссылку на метод, которому принадлежит фрейм стека в пуле констант времени выполнения, и эта ссылка сохраняется для поддержки динамической компоновки во время вызова метода.
адрес возврата метода
- Когда метод начинает выполняться, есть только два способа выйти из метода. Во-первых, механизм выполнения встречает инструкцию байт-кода, возвращаемую любым из методов. Другой способ выхода — когда во время выполнения метода возникает исключение.
17. Диаграмма модели памяти Java
- Модель памяти Java требует, чтобы все переменные хранились в основной памяти.
- Каждый поток также имеет свою собственную рабочую память.
- В рабочей памяти потока хранится копия основной памяти, копия переменных, используемых в потоке.
- Все операции по переменным по ветку должны выполняться в рабочей памяти и не могут напрямую прочитать или запись в основную память.
- Разные потоки не могут напрямую обращаться к переменным в рабочей памяти друг друга, а передача переменных между потоками требует синхронизации данных между их собственной рабочей памятью и основной памятью.
18. Диаграмма перехода состояния потока
- New (Новый): поток, который не был запущен после создания, находится в этом состоянии.
- Выполняется: поток запущен
start()метод, войдет в это состояние. - Бесконечное ожидание (ожидание): потоки в этом состоянии, как правило, не будут выделять время выполнения процессора.
LockSupport::park(), без установки таймаутаObject::wait()метод, который переводит поток в бесконечное состояние ожидания. - Ожидание по времени: потокам в этом состоянии не будет выделяться время выполнения процессора, и они будут автоматически разбужены системой через определенное время.
sleep()Метод войдет в это состояние~ - Заблокировано: когда программа ожидает входа в область синхронизации, поток войдет в это состояние~
- Завершено (Terminated): состояние потока завершенного потока, выполнение потока завершено.
19. Диаграмма формата файла класса
- u1, u2, u4, u8 представляют беззнаковые числа размером 1 байт, 2 байта, 4 байта и 8 байт соответственно.
- Таблица — это составной тип данных, состоящий из нескольких чисел без знака или других таблиц в качестве элементов данных.
- Первые четыре байта каждого файла класса называются магическими числами (помните предыдущее собеседование по приему в школу, интервьюер спросил меня, что такое магические числа...)
- младшая и основная версии указывают номер дополнительной версии, номер основной версии
- Сразу после основных и дополнительных номеров версий идет запись о постоянном пуле.Постоянный пул можно сравнить с хранилищем ресурсов в файле класса~
20. Карта разума параметров JVM
Настройка JVM — это необходимый мост к продвинутой разработке, поэтому хорошо собирайте конфигурации параметров JVM~
Личный публичный аккаунт
- Если вы хороший ребенок, который любит учиться, вы можете подписаться на мой официальный аккаунт, чтобы учиться и обсуждать вместе.
- Если вы считаете, что в этой статье есть какие-либо неточности, вы можете прокомментировать или подписаться на мой официальный аккаунт, пообщаться со мной в частном порядке, и все смогут учиться и прогрессировать вместе.
-
- адрес гитхаба:GitHub.com/Я бы хотел 123/Java…