Серия JVM (5) — алгоритм сборки мусора JVM

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

предисловие

Второй представляетJavaобласть оперативной памяти, гдесчетчик команд,стек виртуальных машин,собственный стек методовТри области рождаются вместе с потоком и исчезают вместе с потоком; фрейм стека в стеке методично выполняет операции всплывающего окна и проталкивания по мере входа и выхода метода. Сколько памяти выделено в каждом кадре стека, в основном известно, когда определена структура класса, поэтомувыделение и освобождение памятиесть обауверенность. В этих областях не нужно слишком много думать о вторичной переработке.Потому что, когда метод закончится или поток закончится, память, естественно, последует за восстановлением.

иJavaкучаиобласть методаВ противном случае память, требуемая несколькими классами реализации в интерфейсе, может быть разной, и память, требуемая несколькими ветвями в методе, также может быть разной. Мы не знаем, какие объекты будут созданы, пока программа не запустится, эта частьвыделение и освобождение памятиобаДинамический,уборщик мусораБеспокойство вызывает эта часть памяти.

текст

(1) Суждение о жизни и смерти субъекта

как судитьJavaОдин из объектов должен"выживать"все еще"умри", что первое, что делает сборщик мусора.

1. Алгоритм подсчета ссылок

Java кучаКаждый конкретный объект в (не цитата) имеетсчетчик ссылок. Когда объект создается и инициализируется с присваиванием, для переменной count устанавливается значение1. Всякий раз, когда есть место для ссылки на него, значение счетчика равноплюс 1. при цитированиинедействителен, то есть когда ссылка на объект превышает время жизни (после выхода за пределы области действия) или устанавливается в новое значение, значение счетчика равноминус 1. Любой счетчик ссылок0объекты можно рассматривать каквывоз мусора. При сборке мусора количество объектов, на которые он ссылается, уменьшается на единицу.

  • преимущество:

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

  • недостаток:

    Трудно обнаружить циклические ссылки между объектами. В то же время счетчики ссылок увеличивают нагрузку на выполнение программы. Так что язык Java не выбирает этот алгоритм для сборки мусора.

2. Алгоритм анализа достижимости

Алгоритмы анализа достижимостиТакже известен какалгоритм поиска корня, через сериюGC Rootsобъект в качестве отправной точки, а затем выполните поиск вниз. искать черездорожканазывается эталонной цепочкой (Reference Chain), когдаобъектприбытьGC Rootsне любойцепочка ссылокПри подключении объектнедостижимый, что означает, что объектнедоступен.

Как показано ниже:Object5,Object6,Object7Несмотря на то, что они взаимосвязаны, ониGC Rootsнедоступен, поэтому он также будет считаться объектом вторичной переработки.

Корневой объект GC

существуетJava, можно использовать какGC RootsОбъекты включают в себя следующие четыре:

  • стек виртуальных машин(в кадре стекатаблица локальных переменных) упоминается в объекте

  • собственный стек методовсерединаJNI(Nativeметод) ссылочная переменная

  • область методасерединастатические свойства классассылочная переменная

  • область методасерединапостоянныйссылочная переменная

    Все современные алгоритмы GC, используемые в JVM, находят все живые объекты до их сбора. Алгоритм анализа достижимости введен из теории графов в дискретной математике, и программа рассматривает все эталонные отношения как граф. На следующем рисунке показано расположение памяти в JVM, и его можно использовать для иллюстрации этой концепции:

(2) Классификация ссылок на объекты

1. Сильная ссылка

вездесущий в коде, что-то вродеObject obj = new Object()Этот вид ссылки, пока сильная ссылка все еще существует, сборщик мусора никогда не вернет объект, на который указывает ссылка.

2. Мягкая ссылка

полезно, но не обязательнообъект, доступныйSoftReferenceкласс для реализации мягких ссылок. произойдет в системеисключение нехватки памятиРанее эти объекты будут перечислены в области утилизации дляВторичная переработка. Если для этой коллекции недостаточно памяти, будет выдано исключение нехватки памяти.

3. Слабая ссылка

не требуетсяобъект, но егосилаСлабее, чем мягкие ссылки, объекты, связанные со слабыми ссылкамиТолькоДожить до следующей сборки мусора,JDKпри условииWeakReferenceкласс для реализации слабых ссылок. Объекты, связанные с программными ссылками, будут восстановлены независимо от того, достаточно ли текущей памяти.

4. Фантомная ссылка

Фантомные ссылки, также известные как призрачные ссылки или фантомные ссылки, представляют собой самый слабый вид связи ссылок.JDKпри условииPhantomReferenceкласс для реализации виртуальных ссылок. Единственная цель установки виртуальной ссылки на объект состоит в том, чтобы иметь возможностьуборщик мусораПолучите один при переработкесистемное уведомление.

(3).дополнительная метка finalize()

Должен ли объект быть в сборщике мусораGCвремя на переработку, по крайней мереПроцесс двойной маркировки.

Первый процесс маркировки,Алгоритмы анализа достижимостиСвязан ли объект анализа сGC Rootsдоступный. был отмечен впервые и прошел скрининг нанедостижимыйбудет отмечен во второй раз.

Второй процесс маркировки для определения необходимости выполнения недостижимого объектаfinalizeметод. Условием выполнения является текущий объектfinalizeМетод был переопределен и еще не вызывался системой. Если разрешено выполнение, объект будет помещен вF-Queryочередь, ожидающая выполнения.

Уведомление:так какfinalizeс более низким приоритетомFinalizerпоток работает, поэтому объектfinalizeМетод не обязательно выполняется, а если и выполняется, то не гарантируетсяfinalizeМетод должен быть выполнен. Если объект отмечен мелким масштабом второй раз, т.е.finalizeЧтобы сохранить себя в методе, вам нужно только повторно связать любой объект в цепочке ссылок.

(4) Алгоритм сборки мусора

В этом разделе подробно представлены идеи различных алгоритмов сборки мусора:

1. Алгоритм маркировки-развертки

пара алгоритмов маркировки-разверткикорневой наборсканироватьвыживатьобъекты отмечены. После завершения разметкибез опознавательных знаковОбъект сканируется на предмет утилизации.

  • преимущество:

    Реализация проста и не требует перемещения объекта.

  • недостаток:

    Процесс маркировки и очистки неэффективен, что приводит к большому количеству прерывистых фрагментов памяти, что увеличивает частоту сборки мусора.

2. Алгоритм репликации

Этот алгоритм сбора решает проблему эффективности алгоритма метки-развертки. Он делит область памяти на одинаковые двеблок памяти. использует только половину пространства за раз,JVMПолученные новые объекты размещаются в половине пространства. Когда половина места занятаGC, скопируйте доступный объект в другую половину пространства, а затем сразу очистите используемое пространство памяти.

  • преимущество:

    Выделяйте память по порядку, который прост в реализации и эффективен в работе, независимо от фрагментации памяти.

  • недостаток:

    Объем доступной памяти уменьшается наполовину, а объекты часто копируются, когда вероятность выживания объектов высока.

3. Алгоритм маркировки-сопоставления

алгоритм маркировки-сопоставленияпринять иалгоритм маркировки-разверткиОбъекты помечаются таким же образом, но вместо непосредственной очистки объектов, подлежащих вторичной переработке, всеуцелевший объектв один конецсвободное местоПереместите, а затем очистите пространство памяти за пределами конечной границы.

  • преимущество:

    Устранены проблемы с фрагментацией памяти с помощью алгоритмов маркировки и очистки.

  • недостаток:

    Локальное перемещение объекта по-прежнему требуется, что в определенной степени снижает эффективность.

4. Алгоритм сбора поколений

В настоящее время коммерческие виртуальные машины используютКоллекция поколенийАлгоритм сборки мусора. Алгоритм сбора поколений, как следует из названия, основан на объектежизненный циклРазделите память на куски. обычно включаютмолодое поколение,старостьипостоянное поколение, как показано на рисунке:

Молодое поколение

Здесь будет размещена большая часть вновь созданных объектов, т.к.большинство объектовбыстро станетнедостижимый, так много объектов создается вКайнозой,Потомпропадать. Процесс исчезновения предметов из этой области называетсяminor GC.

КайнозойEстьEdenрайон и дваSurvivorПлощадь. Новые объекты сначала размещаются вEden(если новый объект слишком велик, он будет размещен непосредственно в старом поколении). существуетGCсередина,Edenобъекты будут перемещены вSurvivor, пока субъект не достигнет определенного возраста (определяемого какGCраз) будет перемещен встарость.

можно установитьКайнозойистаростьотносительный размер. Преимущество такого подхода в том, что численность молодого поколения будет увеличиваться по мерекучаразмерДинамическое расширение. параметр-XX:NewRatioнастраиватьстаростьиКайнозойпропорция. Например-XX:NewRatio=8уточнитьстарое/новое поколениеза8/1. старостьразмер кучи7/8,Кайнозойразмер кучи1/8(по умолчанию1/8).

Например:

-XX:NewSize=64m -XX:MaxNewSize=1024m -XX:NewRatio=8

Старое поколение

Объект не становится недостижимым и удаляется из молодого поколениявыживатьвниз, будеткопироватьсюда. Он занимает больше места, чем новое поколение. также из-за своего родственникабольше места, произошло встаростьВверхGCчемКайнозойхотетьзначительно меньше. объект изстаростьПроцесс исчезновения вmajor GC(илиfull GC).

постоянное поколение

как некоторыеинформация об уровне класса,данные методаиИнформация о методе(какбайт-код,кучаипеременный размер),постоянный пул времени выполнения(JDK7удалено послепостоянное поколение), определенныйСимволическая ссылкаитаблица виртуальных методови Т. Д. они почти всевсе ещеиредкийодеялоУдалить и переработать,существуетJDK8предыдущийHotSpotВ виртуальной машине эти «постоянные» данные класса хранятся впостоянное поколениеПлощадь.

постоянное поколениенепрерывное пространство памяти,мы вJVMможно установить перед запуском-XX:MaxPermSizeзначение для управления размером постоянного поколения. ноJDK8После того, как постоянная генерация была отменена, этиметаданныебыл перемещен в кучу сНет соединенияназываетсяметапространство (Metaspace) изобласть локальной памяти.

резюме

JDK8Куча памяти обычно делится намолодое поколениеистарость,разные эпохиПринимать по своим характеристикамРазличные алгоритмы сборки мусора.

заКайнозой,КаждыйGCвсегдамногообъект умирает, тольконебольшое количествоОбъект живой. Учитывая низкую стоимость тиражирования, целесообразно принятьалгоритм репликации. Поэтому естьFrom SurvivorиTo Survivorплощадь.

застарость, потому что объектвысокая выживаемость, для этого нет дополнительного места в памяти. поэтому подходит дляалгоритм маркировки-разверткииалгоритм маркировки-сопоставлениядля переработки.

Ссылаться на

Чжоу Чжимин, Глубокое понимание виртуальной машины Java: расширенные функции и лучшие практики JVM, Machinery Industry Press


Добро пожаловать в технический публичный аккаунт: Zero One Technology Stack

零壹技术栈

Эта учетная запись будет продолжать делиться сухими товарами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.