ГХ серии JVM
Когда дело доходит до JVM, все знают GC (Garbage Collection).Тема GC - всего одно предложение - автоматическая сборка мусора JVM.Триггерные точки.... Подождите, автор тоже немного разбирается в мехах.Вот рекомендую JVM, который более активен на Zhihu, RednaxelaFX, который специализируется на разработке JVM и известен в отрасли как «R Big». Поставить портал:R большой
Ввиду нехватки знаний у автора, эта запись в блоге подготовлена для того, чтобы изложить собственное понимание GC знакомыми и простыми для понимания словами.
Структура статьи
- Какую память нужно восстановить (Какую)
- GC различные случаи срабатывания (когда)
- Как перерабатывать (Как)
3.1 алгоритм восстановления
3.2 Конкретная реализация HOTSPOT — различные коллекторы- Журнал сборщика мусора
1. Какую память нужно восстановить (Какую)
Большинство Javaers, которые никогда не занимались C или C++, счастливы, потому что они никогда не испытывали ощущения новой удаляемой памяти сами по себе Создание объекта просто новое, независимо от проблемы с восстановлением памяти. Фактически, наша память восстанавливается для нас механизмом GC JVM. Итак, вот в чем проблема. Какую память нужно восстановить?
Отвечать:Алгоритмы анализа достижимостиИ прямо сказано, это набор предопределенных JVMGC rootsСсылочные переменные, такие как Student stu =new Student(); этот stu можно использовать в качестве корней GC. Когда выполняется сборка мусора, JVM находит все живые объекты, на которые можно сослаться через корни GC, а затем помечает оставшиеся объекты как «бесполезные». ", которыйСостояние вторичной переработки!
Ссылки, которые можно использовать в качестве корней GC, следующие:
- Ссылки на объекты в куче GC в текущих активных кадрах стека всех потоков Java; другими словами, параметры/локальные переменные/временные значения ссылочного типа всех вызываемых в данный момент методов.
- Некоторые статические структуры данных ВМ имеют ссылки на объекты в куче GC.Например, таких ссылок в юниверсе много в ВМ HotSpot.
- JNI обрабатывает, в том числе глобальные ручки и локальные ручки (в зависимости от ситуации) все в настоящее время загруженные java-классы (в зависимости от ситуации) статические переменные типа java (в зависимости от ситуации) константы типа ссылки в пуле времени выполнения Java Class (тип или тип класса или классы) (в зависимости от ситуации) ссылка в строковом бассейне (StringTable)
2. Различные сроки запуска GC (когда)
2.1 Типы ГХ
Что касается типов GC, то это еще интереснее.Почему из-за того, что в отрасли нет единого строгого понимания границ, и нет строгого понимания типов GC, существует набор имён для профессора на слева и набор имен для автора справа. Почему так происходит, ведь тип GC связан с коллектором, а разные коллекторы будут иметь свои уникальные типы коллекций. Так автор цитирует здесьR большойЧто касается введения типов GC, то автор считает его достаточно точным. следующее:
- Частичный GC: режим, который не собирает всю кучу GC
- Young GC (MINOR GC): Соберите только Young Gen GC
- Старый сборщик мусора: собирайте сборщик мусора только старого поколения. В этом режиме работает только параллельная коллекция CMS.
- Смешанный GC: собирает GC всего молодого поколения и части старого поколения. Только G1 имеет этот режим
- Полный сборщик мусора (Major GC): собирает всю кучу, включая все части режима Young Gen, Old Gen, Perm Gen (если есть).
2.2 Время запуска
Как видно выше, классификация типов GC связана со сборщиком, поэтому естественно для разных сборщиков время срабатывания GC тоже разное, автор за серийный GC по умолчанию:
- молодой GC: срабатывает, когда область Эдема в молодом поколении заполнена. Обратите внимание, что некоторые выжившие объекты в молодом генерировании будут переведены в старое поколение, поэтому занятость старого поколения обычно увеличивается после молодого генерирования.
- Полный ГК: Когда вы собираетесь вызвать молодой GC, если статистика говорит, что средний продвижение размера предыдущего молодого GC больше, чем текущее оставшееся пространство старого генера, молодой GC не будет вызван, но полный GC Будут срабатывать (поскольку VM-точка доступа в GC, в дополнение к параллельному сбору CMS, другие GCS, которые могут собирать старого GEN, будут собирать весь кучей GC одновременно, включая молодого GEN, поэтому нет необходимости запуска Отдельный молодой GC заранее); или, если есть Пермский генерал, когда Пермский генерал распределяет пространство, но не хватает места, полное GC также должен также срабатывать; или System.gc (), сброс кучи с GC, по умолчанию. это вызвать полный GC.
3. Как перерабатывать (Как)
3.1 Алгоритм восстановления
Поскольку в Интернете уже есть много хорошего блога, чтобы подробно объяснить об этом алгоритме сбора, поэтому этот автор представит ссылки на другой блог и добавлять некоторые описанные сами:
3.1.1Марк-развертка
3.1.2Алгоритм копирования (Coping) (алгоритм, используемый новым поколением большинства коллекционеров)
Использование алгоритма копирования в JVM New Generation из сборки мусора:
Eden:From:TO =8:1:1
Поскольку 90% испытуемых нового поколения являются «мертвыми Чаошэн Си», использование алгоритма копирования целесообразно только в том случае, если первый движущийся объект (сравнительно несколько) выжил, во-вторых, память перемещается в заднюю область. Для последовательного фрагментации памяти нет. .
Стоит отметить, что если в MinorGC объект, выживший в Eden + объект, выживший в From > оставшееся пространство To, объект будет напрямую передан в Old gen через гарантийный механизм, если пространство памяти Old gen недостаточно, то выполняется полная сборка мусора.
Когда возраст объекта достигнет 15 лет, он будет переведен в Old gen (можно настроить параметрами, вообще менять не рекомендуется.)
3.1.3Алгоритм Марк-Компакт:
Поскольку большинство объектов старого поколения имеют большой возраст субъекта, поэтому коэффициент выживаемости относительно высок, использование алгоритма репликации, безусловно, недостаточно (больше операций копирования объектов), поэтому большинство сборщиков старого поколения используют алгоритм Mark-Compact. , чтобы избежать космического мусора.
3.1.4Сравнение трех алгоритмов:
Немного объяснения общих вопросов о времени GC:
Почему время FGC больше, чем minorgc?
Ответ: FGC выполняет сборщик мусора старого поколения.Так как алгоритм использует Mark-Sweep или Mark-Compact, он перемещает много объектов (выживаемость старого поколения очень низкая), что, конечно, требует много времени! На самом деле этопространство для времени, время для пространстваПроблема.
3.2 Конкретная реализация HotSpot — различные сборщики
По поводу сборщика, т.к. я тоже новичок в JVM, и возможностей настроить параметры сборщика в продакшене и использовать их вместе мало. Таким образом, можно сказать, что некоторые коллекционеры HotSpot просто застряли на
Уровень книг и постов в блогах, так что тут выпендриваться не буду. Вот портал для всех, чтобы взглянуть на:
ООО Описание .com / fear 5/50 от 2 ... 88 не
4 журнала сборщика мусора
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-Xloggc:/Users/zdy/Desktop/dump/gclog.txt
Когда сервер часто зависает, попробуйте посмотреть свой собственный журнал GC и обратите внимание на частоту Full gc.
Напоследок немного об опыте автора:
- Если сервер зависает в течение длительного времени, как правило, полное время сборки слишком велико, а приложению требуется короткое время STW, которое может принимать несколько зависаний, то вы можете рассмотреть возможность настройки и увеличения доли молодого поколения. увеличьте возраст входа в старое поколение (по умолчанию 15), чтобы максимально избежать FGC.
- Важно правильно выбрать коллектор. По характеристикам приложения. Это погоня за пропускной способностью, или погоня за минимальной паузой.
- Часто сравнивайте журнал gc, чтобы наблюдать за реальной ситуацией, например, сколько времени требуется для замораживания и сколько времени требуется для замораживания, а затем настраивайте свой сборщик или соответствующий коэффициент памяти для достижения желаемого эффекта.
- В условиях ограниченных физических ресурсов, чтобы не позволить пользователям принимать слишком много STW, вы можете рассмотреть возможность автоматического выполнения gc (System.gc()) посреди ночи.Хотя это может не сработать, вы можете наблюдать эффект . В большинстве случаев будет запущен полный сборщик мусора.
- Большинство приложений могут принимать частые MGC, но не могут принять долгосрочную заморозить полный GC, поэтому обязательно обратите внимание на частоту и запускать условия вашего полного GC при наблюдении журнала GC (из-за гарантии памяти, возраста или Память слишком мала, что приведет к FGC каждый раз.).
Так как автор не особо силен в gc, и не имеет определенного количества практического опыта, он не смеет умалять себя, поэтому даем портал для ознакомления и чтения:
woo woo Краткое описание.com/fear/088's 71 раунд 20…
woohoo.cn blog.com/Майк Виктор0…
woohoo.cn blog.com/Майк Виктор0…