Понимание управления памятью JVM с новой точки зрения

задняя часть JVM алгоритм Безопасность

1. Механизм управления памятью JVM

При проектировании Java-программ код, связанный с выделением и утилизацией памяти, как правило, не задействуется.Вот предложение:Между Java и C++ есть высокая стена, окруженная технологиями динамического выделения памяти и сборки мусора, люди за стеной хотят войти, а люди внутри стены хотят выйти., человек, захваченный из этих двух предложенийдве точки.

  • Механизм автоматического управления памятью в Java значительно экономит энергию разработчиков и позволяет избежать подверженных ошибкам и сложных схем управления памятью, что является большим шагом вперед по сравнению с ручным управлением памятью.
  • Механизм автоматического управления памятью java не может обеспечить оптимальное управление памятью в соответствии с конкретными сценариями, а обеспечивает только общий механизм управления памятью. По сравнению с ручным управлением памятью C++ гибкости недостаточно, и есть узкое место, ограничивающее производительность системы.

Второй момент заключается в том, что у нас есть глубокое понимание смысла механизма управления памятью JVM.Благодаря пониманию принципа мы можем разработать оптимальную стратегию управления памятью JVM в указанном сценарии.Организационная структура этого статья следующая:

  • Распределение памяти JVM
  • Освобождение памяти JVM

2. Распределение памяти JVM

ClassExample refereenceExample  = new ClassExample ();

Приведенный выше код, если его грубо разделить, можно разделить на два процесса:

  1. Выделить объектную память в области кучи
  2. Назначить адрес памяти объекта ссылке на объект Вышеупомянутые два процесса в основном являются двумя важными точками знаний в распределении памяти.Политика выделения памяти и ссылки на объекты#####2.1 Расположение области кучи Нет сомнений в том, что объекты размещаются в куче, и если она разбита вниз, структура памяти области кучи весьма специфична, и ее можно условно разделить на следующие схемы:
    堆内存布局
  • Кайнозой: Как видно из названия, в кайнозойской области обычно хранятся два типа объектов:Объекты, которые только что были новыми, или объекты, которые подверглись небольшому восстановлению памяти..
  • Старость: Старость также можно увидеть из названия.Как правило, хранятся два типа объектов:Большие объекты, занимающие много памяти, и объекты, подвергшиеся множественным процессам высвобождения памяти.
  • Постоянное поколение: память постоянного поколения относительно фиксирована, и объекты класса каждого класса обычно хранятся в постоянном поколении.

Структура памяти в приведенной выше области кучи JVM представляетлогическое представление, а не фактический физический макет. Фактически, JVM предоставляет множество стратегий для выделения и повторного использования памяти. Каждая стратегия будет иметь небольшие различия в логическом представлении, но можно сказать, что приведенное выше логическое представление является полностью логическим представлением.

2.2 Общий процесс выделения памяти

内存分配的一般过程
На рисунке есть несколько важных понятий, которые необходимо подчеркнуть:

  • Настройка порога размера объекта, в JVM можно указать пороговый размер, задав параметр PretenureSizeThreshold.Если размер выделяемого объекта превышает порог, попробуйте освободить место в памяти для хранения объектов в старом поколении, в противном случае попробуйте открыть память пространство для хранения объектов нового поколения.
  • MinorGC, который представляет собой процесс высвобождения памяти в JVM, который также называется процессом сборки мусора.Это восстановление памяти вызвано недостаточным пространством памяти в новом поколении, в основном для переработки объектов памяти в новом генерировании.
  • FullGC, который также является процессом утилизации памяти в JVM,Этот процесс перезапуска памяти вызван недостаточным объемом памяти в старом поколении.Он в основном собирает объекты памяти во всех областях кучи, включая новое поколение, старое поколение и постоянное поколение.
  • целевой возраст, возраст объектов, оставшихся в живых после восстановления памяти, увеличится на 1. Когда возраст объекта превышает указанный порог, он сохраняется в старом поколении из молодого поколения. Пороговое значение возраста этого объекта также можно указать, задав параметр MaxTenuringThreshold JVM.
2.3 Ссылки на объекты

Сведения о макете областей памяти JVMПредставлено в содержимом, связанном со ссылкой на объект.

3. Освобождение памяти JVM

С точки зрения программиста процесс восстановления памяти прозрачен, а конкретные детали скрыты от программиста.Сведения о макете областей памяти JVM, который подробно описывает модель памяти в JVM и типы данных, хранящиеся в каждой области памяти.

JVM内存布局
Основными областями памяти для рециркуляции памяти являются область кучи и область методов, MinorGC и FullGC упоминались выше. MinorGC в основном восстанавливает память для области кучи, а FullGC восстанавливает не только область кучи, но и область методов, что является относительно тяжелым действием по восстановлению. В этой главе о восстановлении памяти в основном рассматриваются следующие три аспекта:1. Какие объекты можно переработать? Решение: анализ достижимости 2. Как восстановить память? Решение: алгоритм маркировки-развертки, алгоритм маркировки-копирования, алгоритм маркировки-сортировки и другие алгоритмы восстановления памяти. 3. Когда уместно перерабатывать? Решение: безопасные точки и безопасные зоны

3.1 Анализ доступности

可达性分析示意图
На приведенном выше рисунке всего семь объектов, направление стрелки представляет собой отношение ссылки, объект 1 относится к объекту 2, а объект 2 относится к объекту 3.Объект 1 — корневой узел (GCROOT), остальные — некорневые узлы (GCROOT).** Анализ достижимости означает: узлы, которые не могут быть достигнуты узлами GCROOT через цепочку ссылок, будут включены в область восстанавливаемых объектов. На объект 6 и объект 7 не может ссылаться ни один узел GCRoot, и они являются целевыми объектами переработки. **JVM считает, что эти объекты не имеют ценности использования, и может их вернуть. **Корневой узел (GCROOT)** – важное понятие, предложенное выше. Вообще говоря, в качестве объектов корневого узла могут использоваться следующие объекты:(1) Объекты, на которые есть ссылки в стеке виртуальной машины JVM (2) Объект ссылки на статический атрибут класса в области метода (3) Ссылочный объект константы класса в области метода (4) Ссылочные объекты в собственном стеке методовАнализ достижимости — это условие принятия решения о высвобождении памяти.После анализа достижимости определите, какие объекты являются целевыми для высвобождения. Помимо анализа доступности,Метод подсчета ссылок также можно использовать для оценки целевого объекта восстановления памяти, но он не может решить проблему циклической ссылки.. Основные JVM используют анализ достижимости.

3.2 Алгоритм восстановления памяти

После анализа достижимости он определит, какие объекты являются целевыми для повторного использования, а затем алгоритм повторного использования памяти выполнит конкретные детали повторного использования. На следующем рисунке показаны три состояния в области памяти: Свободная память — это неиспользуемая память, целевая освобожденная память — это память, которая может быть освобождена после анализа достижимости, а занятая память не нуждается в освобождении.

内存对象

  • алгоритм маркировки-развертки Алгоритм маркировки-очистки — это относительно простой алгоритм освобождения памяти, который напрямую освобождает целевую освобожденную память без каких-либо дополнительных операций. Результат после выполнения алгоритма следующий:
    标记-清除算法执行后的内存图
    Алгоритм mark-sweep прост в логике и понятен, но у него есть фатальный недостаток — он склонен к фрагментации памяти: при выделении больших объектов не может быть достаточно непрерывного пространства памяти, чтобы вызвать частый сборщик мусора.
  • алгоритм пометки-копии Алгоритм пометки-копии — это алгоритм, предложенный для решения проблемы фрагментации памяти.
    image.png
    В настройках алгоритма метки-копии всегда есть пустая область памяти, как показано в длинной области памяти 2 выше. При освобождении памяти все уцелевшие объекты в области памяти копируются в область памяти 2 по порядку, а затем освобождаются все объекты в области памяти 1. Этот подход может значительно избежать фрагментации памяти, но пустые области памяти всегда будут бездействовать, а использование памяти невелико.Как упоминалось выше, память области кучи делится на две области surivior и область Eden с помощью алгоритма метки-копии. Соотношение размеров области Эдема и выжившего по умолчанию составляет 8:1:1.
  • алгоритм маркировки-сопоставления Алгоритм сортировки меток также является алгоритмом восстановления памяти, предложенным для решения проблемы фрагментации памяти.Он добавляет функцию сортировки, основанную на алгоритме очистки меток, для копирования и перемещения объектов памяти, чтобы обеспечить непрерывность пространства и памяти.
    标记-整理算法回收后内存
    Алгоритм пометки для сортировки позволяет преодолеть фрагментацию памяти и не требует дополнительной памяти, но копирование и перемещение объектов занимает много времени. Этот алгоритм обычно используется при переработке объектов старого поколения.
3.3 Когда уместно восстановить память

С помощью анализа достижимости вы можете узнать, какие объекты необходимо перезапустить.В этом процессе вам необходимо перечислить корневой узел, что является трудоемкой операцией.Чтобы обеспечить плавный ход перезапуска памяти, вы должны обеспечить непротиворечивость ссылочной связи, т. е. в Ссылочной связи объекта не изменится в процессе высвобождения памяти. Только восстановление памяти в этих местах является безопасным моментом, поэтому JVM вводитБезопасная точкаКонцепция отношения ссылки на объект в безопасной точке не изменится, что подходит для рециркуляции памяти.безопасный районправдаРасширение концепции безопасной точки, что означает, что отношение ссылки на объект в этой области является согласованным, и восстановление памяти может быть выполнено.