Рубрики
Без рубрики

Понимать сбор мусора в Ява

. С тегами java, управление памятью, программирование, кодирование.

В этом посте мы рассмотрим сборку мусора в 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 , я постараюсь осветить их в своих следующих статьях.

Если у вас есть какие-либо предложения по этой статье, пожалуйста, прокомментируйте. Оригинальное сообщение: Сбор мусора в Ява

Вам также может понравиться:

Оригинал: “https://dev.to/arpitmandliya/understand-garbage-collection-in-java-54bh”