Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / GC basics / 21 сообщений из 21, страница 1 из 1
27.12.2016, 13:51
    #39376036
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GC basics
Читаю серию статей про gc.
есть пара вопросов
https://habrahabr.ru/post/269707/#comment_8633685 Например, если при малой сборке JVM не удается укладываться в отведенное вами время, размер младшего поколения может быть уменьшен. Если не удается достигнуть заданной пропускной способности, а с задержкой проблем нет, то размер поколения будет увеличен. И так далее.

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



Как можно запустить сборку мусора вручную?

и второй вопрос:

https://habrahabr.ru/post/269621/ Рассмотрим такую ситуацию: У нас есть молодой объект A и ссылающийся на него объект B, уже заслуживший место в старшем поколении. В какой-то момент времени оба этих объекта стали нам не нужны и мы обнулили все имеющиеся у нас ссылки на них. Очевидно, объект A можно было бы удалить в ближайшую малую сборку мусора, но для того, чтобы получить это знание, сборщику пришлось бы просмотреть всё старшее поколение и понять, что объект B ссылающийся на A, тоже является мусором, а следовательно их оба можно утилизировать. Но анализ старшего поколения не входит в план малой сборки, так как является относительно дорогой процедурой, поэтому объект А во время малой сборки будет считаться живым.

https://habrahabr.ru/post/269621/ Таким образом, чаще всего для целей малой сборки мусора объект считается мертвым и подлежащим утилизации, если до него невозможно добраться по ссылкам ни из объектов старшего поколения, ни из так называемых корней (roots), к каковым относятся ссылки из стеков потоков, статические члены классов и т. п. При полной сборке мусора могут анализироваться оба поколения, поэтому здесь сборщик может плясать только от корней.

Эти две цитаты идут в тексте последовательно. Как я их понял они друг другу противоречат. В первой говорится, что старшее поколение не сканирует при minor gc, а во второй пишут, что при minor gc объект считается мертвым если до него не добраться п о ссылкам ни из объектов старшего поколения, ...

Так как же мы узнаем, что до объекта не добраться из старшего поколения если мы это самое поколение сканировать не будем?
...
Рейтинг: 0 / 0
27.12.2016, 14:22
    #39376083
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GC basics
questionerКак можно запустить сборку мусора вручную?

System.gc()
MemoryMXBean.gc()
оба вызывают
Runtime.getRuntime().gc()
...
Рейтинг: 0 / 0
27.12.2016, 14:25
    #39376089
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GC basics
questionerЭти две цитаты идут в тексте последовательно. Как я их понял они друг другу противоречат. В первой говорится, что старшее поколение не сканирует при minor gc, а во второй пишут, что при minor gc объект считается мертвым если до него не добраться п о ссылкам ни из объектов старшего поколения, ...

Так как же мы узнаем, что до объекта не добраться из старшего поколения если мы это самое поколение сканировать не будем?
Объект А считается живым, так как на него есть ссылка из старого поколения. В чем противоречие?
...
Рейтинг: 0 / 0
27.12.2016, 14:54
    #39376123
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GC basics
Blazkowicz Объект А считается живым, так как на него есть ссылка из старого поколения. В чем противоречие?

Противоречие с этой фразой:
habrТаким образом, чаще всего для целей малой сборки мусора объект считается мертвым и подлежащим утилизации, если до него невозможно добраться по ссылкам ни из объектов старшего поколения, ни из так называемых корней (roots), к каковым относятся ссылки из стеков потоков, статические члены классов и т. п. При полной сборке мусора могут анализироваться оба поколения, поэтому здесь сборщик может плясать только от корней.

Как я понимаю этот абзац, чтобы удалить объект из young generation нам нужно понять нет ли ссылок на него в old generation. Как я понимаю для этого нам нужно сканировать old generation.

habr Но анализ старшего поколения не входит в план малой сборки, так как является относительно дорогой процедурой, поэтому объект А во время малой сборки будет считаться живым.
...
Рейтинг: 0 / 0
27.12.2016, 15:05
    #39376138
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GC basics
questionerКак я понимаю этот абзац, чтобы удалить объект из young generation нам нужно понять нет ли ссылок на него в old generation. Как я понимаю для этого нам нужно сканировать old generation.
Нет. Сканировать oldgen нужно чтобы найти все живые объекты там. Его не нужно сканировать для того чтобы знать что на объект А есть ссылка из oldgen. Ссылка из old gen для minor сборки аналогична GC Root - она обозначает что объект живой и он не будет собран. Даже если по факту, может быть уже и доступен для сборки.
...
Рейтинг: 0 / 0
27.12.2016, 15:12
    #39376145
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GC basics
questioner,

Вот ещё хороший ответ с объяснением как именно это работает
http://stackoverflow.com/a/3849058
...
Рейтинг: 0 / 0
27.12.2016, 15:59
    #39376197
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GC basics
Blazkowiczquestioner,

Вот ещё хороший ответ с объяснением как именно это работает
http://stackoverflow.com/a/3849058

Спасибо. Получается просто прогуляться по old generation мы можем, а вот анализироваться он не будет уже при minor gc
...
Рейтинг: 0 / 0
27.12.2016, 16:00
    #39376201
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GC basics
questionerСпасибо. Получается просто прогуляться по old generation мы можем, а вот анализироваться он не будет уже при minor gc
До Card Table не дочитал?
...
Рейтинг: 0 / 0
27.12.2016, 16:40
    #39376242
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GC basics
BlazkowiczДо Card Table не дочитал?

Дочитал. Понял, что суть его в том, чтобы весь old не сканировать, а только те его участки, в которых могут быть ссылки на young.

А вот принцип, я не уверен, что понял верно.

old generation делится на сегменты некоторого фиксированного размера(его можно менять кстати?). Допустим сегментов 1000.
создаем булеан массив на 1000 элементов.
в каждом сегменте n-ое количество объектов. Так вот если у объекта(из old generation) меняется какая-либо внутренняя ссылка, то карта считается грязной.
после того как объект попал в old generation, то видимо у него не может быть ссылок на young изначально. и поэтому по умолчанию карта чистая.
...
Рейтинг: 0 / 0
27.12.2016, 16:55
    #39376259
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GC basics
булеан элемент в массиве соответствует карте. карта соответствует некоторому количеству объектов
...
Рейтинг: 0 / 0
28.12.2016, 12:05
    #39376729
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GC basics
Blazkowicz,
я так понимаю это 4 точки откуда gc начинает поиск мусора:
автор-Локальные переменные и параметры методов
-Java Потоки
-Статические переменные
-Ссылки из JNI


При этом gc чистит только heap.
А как же область памяти стек, в котором хранятся локальные переменные и параметры методов ?

Что-то я совсем запутался.

всего ведь бывает java использует

heap
stack
Permanent Generation/metaspace
Code Cache(я так понимаю для нативности)

Насколько я понимаю структура используемой памяти задаётся gc.

а стек в этой иерархии где?
Чистится ли стек?
локальные переменные таки в хипе или в стеке?
...
Рейтинг: 0 / 0
28.12.2016, 12:21
    #39376749
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GC basics
questionerА как же область памяти стек, в котором хранятся локальные переменные и параметры методов ?


Вы ни на чем низкоуровневом не писали чтоли? Аля C Assembler etc

При каждом вызове метода(если он не заинлайнен конечно) создается фрейм, при создании локальных примитивных переменных, память им выделяется на стеке, а когда метод заканчивает выполнение -автоматически удаляется. Если переменные не примитивные а ссылки на объект, то тут возможны варианты. Если JVM может гарантировать что объект не покинет метод, то обычно объект не создается, а раскладывается по стеку или регистрам в виде примитивов. Если объект может покинуть метод, то память под него будет выделяться в heap
...
Рейтинг: 0 / 0
28.12.2016, 12:27
    #39376756
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GC basics
questionerя так понимаю это 4 точки откуда gc начинает поиск мусора:
автор-Локальные переменные и параметры методов
-Java Потоки
-Статические переменные
-Ссылки из JNI
Нет. То как именно происходит сканирование живых объектов, это уже нюансы реализации конкретного алгоритма GC.
Перечисленные GC Root это те ссылки, из-за которых объекты считаются живыми. А с них начинается сканирование, или нет, это вопрос десятый.
Я вообще не понимаю зачем ты пытаешься понять ТОЧНЫЙ алгоритм работы GC, не ознакомившись обзорно, хотя бы с алгоритмами и фазами.

questionerПри этом gc чистит только heap.
Ну, как бы хип для этого и предназначен, чтобы GC в нём работал.

questionerА как же область памяти стек, в котором хранятся локальные переменные и параметры методов ?
Что с ней? Там объектов нет. Там фреймы. Вышли из фрейма - фрейм убили со всеми его переменными. Можем ещё и объектов прихватить парочку, если они за пределы фрейма не утекают (см. escape analysis)

questionerЧто-то я совсем запутался.
Потому что ты пытаешься глубоко нырять там где нужно просто осмотреться по сторонам.

questionerНасколько я понимаю структура используемой памяти задаётся gc.
Нет.

questionerа стек в этой иерархии где?
Какой ещё иерархии?
questionerЧистится ли стек?
Ты дебагал когда-нибудь? Термин "фрейм" видел в окне отладки? Фрейм это такая пачка данных. Лежит на стеке, после использования диспозится.

questionerлокальные переменные таки в хипе или в стеке?
Конечно, в стеке. Локальные переменные это ссылки же и примитивы. Хотя в Java 9 или 10, возможно, ещё добавят возможность располагать объекты на стеке.
...
Рейтинг: 0 / 0
28.12.2016, 12:29
    #39376760
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GC basics
забыл никЕсли JVM может гарантировать что объект не покинет метод, то обычно объект не создается, а раскладывается по стеку или регистрам в виде примитивов. Если объект может покинуть метод, то память под него будет выделяться в heap
Это всё уже очень сильно зависит от реализации конкретной JVM.
...
Рейтинг: 0 / 0
28.12.2016, 12:39
    #39376779
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GC basics
Blazkowicz,

BlazkowiczЯ вообще не понимаю зачем ты пытаешься понять ТОЧНЫЙ алгоритм работы GC, не ознакомившись обзорно, хотя бы с алгоритмами и фазами.

Я почитал про структуру хипа, про young/old gen, про serial,parallel,cms/g1, в курсе про minor/major gc. Понимаю что такое STW.
Что ещё почитать?

Просто не понятно почему говорят, что локальные переменные создаются на стеке, а чистим мы их в хипе. Мне непонятно как они туда попадают.
...
Рейтинг: 0 / 0
28.12.2016, 12:42
    #39376782
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GC basics
BlazkowiczЛокальные переменные это ссылки же и примитивы.

Это многое объясняет
...
Рейтинг: 0 / 0
28.12.2016, 12:50
    #39376793
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GC basics
BlazkowiczquestionerНасколько я понимаю структура используемой памяти задаётся gc.
Нет.


В G1 ведь память по другому менеджит.

поколения те же, но ведь они разбросаны вразнобой
...
Рейтинг: 0 / 0
28.12.2016, 12:54
    #39376802
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GC basics
questionerВ G1 ведь память по другому менеджит.
поколения те же, но ведь они разбросаны вразнобой
Но это всё происходит внутри кучи и не относится к тем типам памяти, которые ты перечисляешь в этой теме.
...
Рейтинг: 0 / 0
28.12.2016, 13:01
    #39376815
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GC basics
BlazkowiczquestionerВ G1 ведь память по другому менеджит.
поколения те же, но ведь они разбросаны вразнобой
Но это всё происходит внутри кучи и не относится к тем типам памяти, которые ты перечисляешь в этой теме.

ошибся, надо было написать структуру хипа, а не памяти.
...
Рейтинг: 0 / 0
02.01.2017, 01:51
    #39378806
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GC basics
Blazkowicz,

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

Каждый поток сборщика получает свой участок памяти в регионе Old Gen, так называемый буфер повышения (promotion buffer), куда только он может переносить данные, чтобы не мешать другим потокам. Такой подход ускоряет сборку мусора, но имеет и небольшое негативное последствие в виде возможной фрагментации памяти:


После major gc parallel-ым gc в old gen данные будут полностью уплотнены или только в рамках участка, отданного потока?
...
Рейтинг: 0 / 0
02.01.2017, 01:53
    #39378807
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GC basics
questionerданные будут полностью
объекты
questionerотданного потока?

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


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