В этом посте мы рассмотрим сборку мусора в java .
Я постараюсь объяснить с помощью диаграмм и примеров, а не теории.
Память JVM разделена на три части
- Молодое поколение
- Старое поколение
- Метапространство (Пермское поколение)
Молодое поколение
Как следует из названия, молодое поколение – это область, в которой размещаются вновь созданные объекты .
- Когда молодое поколение заполняется, это вызывает незначительный сбор мусора, он же незначительный сбор мусора.
- При возникновении незначительных Gcs мертвые объекты будут удалены из молодого поколения.
- Если у вас много мертвых объектов в молодом поколении, незначительный GC будет выполняться быстрее.
- Все второстепенные GCS являются событиями “остановить мир”, поэтому, когда происходят второстепенные GCS, потоки приложений также останавливаются.
Давайте подробнее разберемся в том, как распределяются объекты в молодом поколении.
Молодое поколение делится на 3 части.
- Райское пространство
- Места для выживших 0
- Места для выживших 1
Вот иллюстрация молодого и старого поколения.
- Все вновь созданные объекты размещаются в пространстве эдема.
- Когда пространство Эдема будет полностью заполнено объектами, произойдет незначительный GC. Все объекты, которые не являются мертвыми или не затронутыми, будут перемещены в одно из оставшихся в живых пространств. В нашем случае, допустим, все объекты перемещены в S0.
- Когда пространство Эдема снова заполнится, все живые объекты в пространстве Эдема и в пространстве Выживших 0 будут перемещены в пространство выживших S1.
- Как только объекты переживут несколько циклов незначительного GC, они будут перемещены в старое поколение. Вы можете контролировать этот порог с помощью MaxTenuringThreshold. Фактический порог аренды динамически регулируется JVM.
Давайте попробуем продемонстрировать это поведение с помощью примера: У вас есть класс ниже, в котором я создаю недолговечные объекты для демонстрации.
package org.arpit.java2blog; import java.math.BigDecimal; public class GCCollectorExample { public static void main(String args[]) { createObjects(); } private static void createObjects() { long count = 0; while(true) { // Creating short-lived objects just for illustration BigDecimal shortLivedBigDecimal1 = new BigDecimal(count++); } } }
Когда вы запускаете программу. Давайте проверим выделение памяти в Visual GC (плагин VisualVM)
Как вы можете видеть, у нас мало объектов в S0, и как только пространство eden будет полностью заполнено, все объекты, на которые ссылаются, будут перемещены в S1.
Старое поколение
- Он используется для хранения старых давно сохранившихся предметов
- Это, как правило, больше, чем молодое поколение.
- Когда арендуемое пространство будет полностью заполнено (или заданный порог) объектами, произойдет крупный сбор мусора. Это восстановит память и освободит место.
- Часто крупные ГК протекают медленнее и реже, чем незначительные ГК.
Как вы можете использовать эту информацию для оптимизации памяти? Это зависит от характера применения. Если у вас много временных объектов, то будет много второстепенных gc. Вы можете привести аргументы, чтобы распределить 50 % среди молодого поколения и 50 % среди пожилых. По умолчанию, следовательно, молодое поколение составляет 1/3 от общей кучи. Аналогично, если у вас слишком много долгоживущих объектов, вам может потребоваться увеличить площадь владения, установив высокое значение NewRatio.
Почему два места для выживших?
Почему два места для выживших? Вам, должно быть, интересно, почему у нас есть 2 места для выживших. Почему два места для выживших? Вам, должно быть, интересно, почему у нас есть 2 места для выживших. У нас есть 2 места для выживших, чтобы избежать фрагментации памяти. Почему два места для выживших? Вам, должно быть, интересно, почему у нас есть 2 места для выживших. У нас есть 2 места для выживших, чтобы избежать фрагментации памяти. Каждый раз, когда вы копируете объекты из эдема в выжившего, вы получаете пустое пространство эдема и 1 пустое пространство выжившего.
Почему два места для выживших? Вам, должно быть, интересно, почему у нас есть 2 места для выживших. У нас есть 2 места для выживших, чтобы избежать фрагментации памяти. Каждый раз, когда вы копируете объекты из eden в survivor, вы получаете пустое пространство eden и 1 пустой алгоритм сбора мусора survivor spa ce.
Почему два места для выживших? Вам, должно быть, интересно, почему у нас есть 2 места для выживших. У нас есть 2 места для выживших, чтобы избежать фрагментации памяти. Каждый раз, когда вы копируете объекты из eden в survivor и получаете пустое пространство eden и 1 пустой алгоритм сбора мусора survivor spa, JVM поставляется с несколькими алгоритмами для молодого и старого поколения.ce. Существует 3 типа алгоритмов
последовательный коллектор
Он использует один поток для выполнения всей сборки мусора и подходит для базового приложения с однопроцессорными машинами.
Параллельный коллектор
Он использует несколько процессоров для выполнения сбора мусора. В то время как последовательный сборщик использует 1 поток для выполнения GC, параллельный GC использует несколько потоков для выполнения GC, и это полезно, когда имеется достаточно памяти и большое количество ядер.
Параллельный коллектор
Параллельный сборщик выполняет сборку мусора с потоками приложений. Это полезно для приложений, которые имеют средние и большие наборы данных и требуют быстрого времени отклика.
Вы можете использовать разные алгоритмы GC для молодого и старого поколений, но вы можете сочетать только совместимые алгоритмы.
Например: Вы не можете связать ParallelScavenge для молодого поколения с одновременной разверткой отметок для старого, поскольку параллельная очистка не обеспечивает синхронизацию, которая требуется в CMS.
Вот сборщики мусора, которые вы можете использовать для молодого и старого поколения. [таблица/]
Есть много изменений в сборщиках мусора после Java 8 , я постараюсь осветить их в своих следующих статьях.
Если у вас есть какие-либо предложения по этой статье, пожалуйста, прокомментируйте. Оригинальное сообщение: Сбор мусора в Ява
Вам также может понравиться:
- Основной учебник по java
- Весенний урок
- Весенний учебник по MVC
- Пример веб-приложения для весенней загрузки
- Пример гибернации при весенней загрузке
- Вопросы для интервью с весенней загрузкой
- Вопросы для весеннего интервью
Оригинал: “https://dev.to/arpitmandliya/understand-garbage-collection-in-java-54bh”