powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как CMS работает без полной сборки мусора.
23 сообщений из 23, страница 1 из 1
Как CMS работает без полной сборки мусора.
    #39378880
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вычитал, что cms gc не имеет цикла полной сборки мусора.

Малая сборка не отличается от parallel.

а вот вместо полной только major gc(чистка OldGen/tenured)

Получается, что при малой сборке если на объект из young ссылается объект из old, то объект считается живым.
Аналогично получается, что при major gc не сканируется young, соответственно если у объекта из tenured есть ссылка на young(или у объекта из young есть ссылка на tenured), то это рецепт бессмертия для этого сборщика мусора?

Я всё правильно понял ?

Как-то странно звучит.
...
Рейтинг: 0 / 0
Как CMS работает без полной сборки мусора.
    #39378881
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, неправильно. Заканчивайте читать желтуху, есть же официальные туториалы от оракла
...
Рейтинг: 0 / 0
Как CMS работает без полной сборки мусора.
    #39378884
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл никНет, неправильно. Заканчивайте читать желтуху, есть же официальные туториалы от оракла

Может быть поясните, что конкретно не так, если понимаете?
...
Рейтинг: 0 / 0
Как CMS работает без полной сборки мусора.
    #39378933
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

насколько я себе понимаю философию CMS (Conc-Mark-Sweep) этот сборщик
расчитан на оконные приложения которые работают с пользователем и как следствие
требуют наиболее быстрого времени отклика (малого времени stop-the-world)
и как следствие жертвует полнотой очистки. Грубо говоря 97% мусора будут
собраны за гарантийное короткое время а оставшиеся 3% убирать дорого
(циклические связи и все такое) и CMS на них забивает болт.

Иначе CMS не был-бы CMS-ом.
...
Рейтинг: 0 / 0
Как CMS работает без полной сборки мусора.
    #39378952
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonнасколько я себе понимаю философию CMS (Conc-Mark-Sweep) этот сборщик
расчитан на оконные приложения которые работают с пользователем
Да-да. Это, ведь, для любого сервера нормально уходить в отказ на десятки секунд.
...
Рейтинг: 0 / 0
Как CMS работает без полной сборки мусора.
    #39378953
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczmaytonнасколько я себе понимаю философию CMS (Conc-Mark-Sweep) этот сборщик
расчитан на оконные приложения которые работают с пользователем
Да-да. Это, ведь, для любого сервера нормально уходить в отказ на десятки секунд.
Смотря какие задачи ставить. Если это бизнес-процессы загрузки-выгрузки и ETL
то - нормально. Но почему вы говорите о нескольких секундах? Выглядит как
передёргивание моих слов.
...
Рейтинг: 0 / 0
Как CMS работает без полной сборки мусора.
    #39379045
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonquestioner,

насколько я себе понимаю философию CMS (Conc-Mark-Sweep) этот сборщик
расчитан на оконные приложения которые работают с пользователем и как следствие
требуют наиболее быстрого времени отклика (малого времени stop-the-world)
и как следствие жертвует полнотой очистки. Грубо говоря 97% мусора будут
собраны за гарантийное короткое время а оставшиеся 3% убирать дорого
(циклические связи и все такое) и CMS на них забивает болт.

Иначе CMS не был-бы CMS-ом.


Насколько я понял философию, убирать не весь мусор может только G1. Время ему задали, сколько успел, столько собрал.

Вроде про cms такого не пишут.

Но мой вопрос немного другой.
...
Рейтинг: 0 / 0
Как CMS работает без полной сборки мусора.
    #39379086
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerзабыл никНет, неправильно. Заканчивайте читать желтуху, есть же официальные туториалы от оракла

Может быть поясните, что конкретно не так, если понимаете?

Первая ссылка в гугле .
Две стоп-паузы там на полной сборке.

Вообще стандартное решение для исключения пауз (наприм для рекламного сервера)- выключить сборку old-gen нафиг и перезагружать ноды кластера раз в N часов.
...
Рейтинг: 0 / 0
Как CMS работает без полной сборки мусора.
    #39379110
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominВообще стандартное решение для исключения пауз (наприм для рекламного сервера)- выключить сборку old-gen нафиг и перезагружать ноды кластера раз в N часов.
Это трудно назвать стандартым. Обычно, правильная пропорция поколений вполне себе помогает.
...
Рейтинг: 0 / 0
Как CMS работает без полной сборки мусора.
    #39379112
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСмотря какие задачи ставить. Если это бизнес-процессы загрузки-выгрузки и ETL то - нормально.

В среднем по больнице это не самый распространенный вид проектов. Задача сервера - обслужить множество клиентов. А единичные молотилки, это только ETL и краулеры.

maytonНо почему вы говорите о нескольких секундах? Выглядит как
передёргивание моих слов.
Потому как на нормальном высоконагруженном сервере до появления CMS порядок stop-the-world пауз был именно такой.
...
Рейтинг: 0 / 0
Как CMS работает без полной сборки мусора.
    #39379121
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerПолучается, что при малой сборке если на объект из young ссылается объект из old, то объект считается живым.

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

questionerАналогично получается, что при major gc не сканируется young, соответственно если у объекта из tenured есть ссылка на young(или у объекта из young есть ссылка на tenured), то это рецепт бессмертия для этого сборщика мусора?

Нет, молодое поколение также собирается при работе CMS, с учетом того что у CMS алгоритмы более CPU затратные, то по этому поводу даже опция есть ScavengeBeforeFullGC , позволяющая сначала запустить минорную сборку, чтобы CMS-у меньше работы осталось в новом поколении. А где Вы вообще прочитали этот бред? Дайте пожалуста ссылку.
...
Рейтинг: 0 / 0
Как CMS работает без полной сборки мусора.
    #39379176
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAlexey TominВообще стандартное решение для исключения пауз (наприм для рекламного сервера)- выключить сборку old-gen нафиг и перезагружать ноды кластера раз в N часов.
Это трудно назвать стандартым. Обычно, правильная пропорция поколений вполне себе помогает.

А есть реальные решения RT-софта?
С перезапуском- про одно на joker разказывали, другое коллеги поддерживают.
...
Рейтинг: 0 / 0
Как CMS работает без полной сборки мусора.
    #39381453
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton а оставшиеся 3% убирать дорого
(циклические связи и все такое) и CMS на них забивает болт.
Насколько я понимаю, все Марк&Свипы как раз очень легко справляются с циклами - собственно для вымарывания их и задумывались.
У них другая проблема - он не может освободить память полностью не отработав, поскольку до этого момента он знает только какая часть "занята".

Если я правильно представляю алгоритм , то он строится на трех красках. При выделении памяти она становится черной. Далее грубое представление:
1. Вся занятая память маркируется белой.
2. Берем gc_root и помечаем фрагменты на которые они ссылаются серым.
3. Пробегаем по всем серым и меняем их на черные, а все белые фрагменты, на которые они ссылаются серыми.
4. Если были серые возвращаемся на п.3
5. Все белое - свободно.

Из недостатков, алгоритм не копирующий, а значит есть все преимущества фрагментирования памяти. Ну и weak(soft)reference усложняет жизнь - надо следить чтоб не успело передать ссылку из нее в gc_root или черный квадрат. :)
...
Рейтинг: 0 / 0
Как CMS работает без полной сборки мусора.
    #39381536
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vimba А где Вы вообще прочитали этот бред? Дайте пожалуста ссылку.

https://habrahabr.ru/post/269863/ При этом CMS GC использует ту же самую организацию памяти, что и уже рассмотренные Serial / Parallel GC: регионы Eden + Survivor 0 + Survivor 1 + Tenured и такие же принципы малой сборки мусора. Отличия начинаются только тогда, когда дело доходит до полной сборки. В случае CMS ее называют старшей (major) сборкой, а не полной, так как она не затрагивает объекты младшего поколения. В результате, малая и старшая сборки здесь всегда разделены. Одним из побочных эффектов такого разделения является то, что все объекты младшего поколения (даже потенциально мертвые) могут играть роль корней при определении статуса объектов в старшем поколении.
...
Рейтинг: 0 / 0
Как CMS работает без полной сборки мусора.
    #39381805
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey Tominquestionerпропущено...


Может быть поясните, что конкретно не так, если понимаете?

Первая ссылка в гугле .
Две стоп-паузы там на полной сборке.

Вообще стандартное решение для исключения пауз (наприм для рекламного сервера)- выключить сборку old-gen нафиг и перезагружать ноды кластера раз в N часов.

в приведенной ссылке тоже написано, что это чистка old generation и на ней 2 паузы STW.
...
Рейтинг: 0 / 0
Как CMS работает без полной сборки мусора.
    #39382035
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerв приведенной ссылке тоже написано, что это чистка old generation и на ней 2 паузы STW.
Чтоб без пауз работать надо следить за всеми операциями с ссылками, а это поди дороже выйдет.

Вот чего не понятно, почему здесь рисуют initial mark однопроходным

Ведь и он легко раскладывается по потокам хоть по количеству потоков в основном приложении.
...
Рейтинг: 0 / 0
Как CMS работает без полной сборки мусора.
    #39382214
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньевquestionerв приведенной ссылке тоже написано, что это чистка old generation и на ней 2 паузы STW.
Чтоб без пауз работать надо следить за всеми операциями с ссылками, а это поди дороже выйдет.

Вот чего не понятно, почему здесь рисуют initial mark однопроходным

Ведь и он легко раскладывается по потокам хоть по количеству потоков в основном приложении.

Вы уводите беседу в сторону)
...
Рейтинг: 0 / 0
Как CMS работает без полной сборки мусора.
    #39382662
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

это я похоже фигню сморозил. CMS действительно не чистит NewGen сам, меня переглючило как раз таки из-за того что у меня параметер CMSScavengeBeforeRemark всегда выставлен, поэтому сборщик нового поколения всегда запускается перед remark, и я по нивнимательности просматривая логи думал, что новое поколение чистит CMS.

Соответсвенно если убрать парметр CMSScavengeBeforeRemark, и запустить такой несложный пример, то действительно наглядно видно как unreacheable объекты в Young удерживают от сборки unreacheable объекты в Tenured.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;

/**
 * Created by vladimir.bukhtoyarov on 11.01.2017.
 */
public class MemoryConsumer {

    private final ScheduledExecutorService scheduler;
    private ConcurrentHashMap<Long, byte[]> memory = new ConcurrentHashMap<>();
    private final AtomicLong sequence = new AtomicLong();

    MemoryConsumer() {
        this.scheduler = Executors.newScheduledThreadPool(1);
    }

    void shutdown() {
        scheduler.shutdown();
    }

    void consume(int megabytes, int seconds) {
        byte[] oldBytes = new byte[1_000_000 * megabytes];

        Long chunkId = sequence.incrementAndGet();
        memory.put(chunkId, oldBytes);
        scheduler.schedule(() -> memory.remove(chunkId), seconds, TimeUnit.SECONDS);
    }

    /*
    -Xmx1024m
    -Xms1024m
    -XX:+UseParNewGC
    -XX:+UseConcMarkSweepGC
    -XX:NewSize=64m
    -XX:MaxNewSize=64m
    -XX:+UseCMSInitiatingOccupancyOnly
    -XX:CMSInitiatingOccupancyFraction=50
    -verbose:gc
    -XX:+PrintGC
    -XX:+PrintGCDetails
    -XX:+PrintGCTimeStamps
    -XX:+PrintGCDateStamps
    -XX:+PrintTenuringDistribution
     */
    public static void main(String[] args) throws InterruptedException {
        long startMillis = System.currentTimeMillis();
        MemoryConsumer consumer = new MemoryConsumer();
        try {
            while (true) {
                long secondsSinceStart = (System.currentTimeMillis() - startMillis) / 1000;
                System.out.println(secondsSinceStart + " seconds since start");
                consumer.consume(100,  1);
                TimeUnit.SECONDS.sleep(5);
            }
        } finally {
            consumer.shutdown();
        }
    }

}


Однако совсем крахом, дело не заканчивается, когда GC видит, что уже совсем кирдык и сейчас придётся упасть, он запускает сборку в Young, и соответсвенно там чистятся unreachable ссылки в старое поколение, затем запускается сборка старого поколения но уже в режиме "concurrent mode failure".

Вернув ключик -XX:+CMSScavengeBeforeRemark получим приемлимое поведение, и старое поколение будет вычищаться в 0 как только оно заполнилось на 50%
...
Рейтинг: 0 / 0
Как CMS работает без полной сборки мусора.
    #39382757
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO & AFAIK вся тема какой-то пересказ второразрядной доки. Вроде официальные доки вполне нормально различные модели GC описывают. Так же как плюсы и минусы различных сборшиков.

p.s. CMS ни разу на реальных системах не использовал. Parallel collector на размерах кучи в единицы GB вполне прилично работает..
...
Рейтинг: 0 / 0
Как CMS работает без полной сборки мусора.
    #39383021
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerВы уводите беседу в сторону)
Так прямой ответ так и звучит. Для того и придуманы поколения, чтоб над каждым трудился свой сборщик мусора. Над младым уже давно трудится простой копирующий, а CMS,ParallelGC,G1 занимаются теми объектами, что постарше. Ибо нет серебряной пули.

Вот ответ на первоначальный вопрос.
...
Рейтинг: 0 / 0
Как CMS работает без полной сборки мусора.
    #39383038
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей АрсеньевquestionerВы уводите беседу в сторону)
Так прямой ответ так и звучит. Для того и придуманы поколения, чтоб над каждым трудился свой сборщик мусора. Над младым уже давно трудится простой копирующий, а CMS,ParallelGC,G1 занимаются теми объектами, что постарше. Ибо нет серебряной пули.

Вот ответ на первоначальный вопрос.

Ну вообще всегда используется только 1(один!) gc.

а внутри него уже какие-то алгоритмы.

Каждый коллектор трудится над уборкой всех поколений
...
Рейтинг: 0 / 0
Как CMS работает без полной сборки мусора.
    #39383041
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerНу вообще всегда используется только 1(один!) gc.
а внутри него уже какие-то алгоритмы.
Каждый коллектор трудится над уборкой всех поколений
Вообще-то нет. Для старого и нового поколения тип GC можно конфигурировать отдельно. Некоторые из них несовместимы и не могут быть использованы вместе.
...
Рейтинг: 0 / 0
Как CMS работает без полной сборки мусора.
    #39383346
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerКаждый коллектор трудится над уборкой всех поколений
Фраза -XX:+CMS Scavenge BeforeRemark ни на что не намекает?

немного старая картинка с Оракла
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как CMS работает без полной сборки мусора.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]