Базовая диаграмма для Java-программистов

Java

предисловие

Недавно я прочитал третье издание книги «Глубокое понимание виртуальной машины Java» и разобрался с некоторыми базовыми структурными схемами, которые относительно полны. Делайте заметки и учитесь вместе.

GitHub.com/Я бы хотел 123/Java…

1. Диаграмма области данных времени выполнения виртуальной машины Java

Структура памяти JVM — это основа, которую должны освоить 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. Диаграмма перехода состояния потока

Язык Java определяет шесть состояний пула потоков:

  • New (Новый): поток, который не был запущен после создания, находится в этом состоянии.
  • Выполняется: поток запущенstart()метод, войдет в это состояние.
  • Бесконечное ожидание (ожидание): потоки в этом состоянии, как правило, не будут выделять время выполнения процессора.LockSupport::park(), без установки таймаутаObject::wait()метод, который переводит поток в бесконечное состояние ожидания.
  • Ожидание по времени: потокам в этом состоянии не будет выделяться время выполнения процессора, и они будут автоматически разбужены системой через определенное время.sleep()Метод войдет в это состояние~
  • Заблокировано: когда программа ожидает входа в область синхронизации, поток войдет в это состояние~
  • Завершено (Terminated): состояние потока завершенного потока, выполнение потока завершено.

19. Диаграмма формата файла класса

  • u1, u2, u4, u8 представляют беззнаковые числа размером 1 байт, 2 байта, 4 байта и 8 байт соответственно.
  • Таблица — это составной тип данных, состоящий из нескольких чисел без знака или других таблиц в качестве элементов данных.
  • Первые четыре байта каждого файла класса называются магическими числами (помните предыдущее собеседование по приему в школу, интервьюер спросил меня, что такое магические числа...)
  • младшая и основная версии указывают номер дополнительной версии, номер основной версии
  • Сразу после основных и дополнительных номеров версий идет запись о постоянном пуле.Постоянный пул можно сравнить с хранилищем ресурсов в файле класса~

20. Карта разума параметров JVM

Настройка JVM — это необходимый мост к продвинутой разработке, поэтому хорошо собирайте конфигурации параметров JVM~

Личный публичный аккаунт

  • Если вы хороший ребенок, который любит учиться, вы можете подписаться на мой официальный аккаунт, чтобы учиться и обсуждать вместе.
  • Если вы считаете, что в этой статье есть какие-либо неточности, вы можете прокомментировать или подписаться на мой официальный аккаунт, пообщаться со мной в частном порядке, и все смогут учиться и прогрессировать вместе.