Почему новые объекты Java должны создаваться в пространстве Eden? - PullRequest
0 голосов
/ 19 сентября 2019

Java Garbage Collection использует сборщик копий для молодых объектов.Область Молодого Поколения разделена на «Пространство Эдема» и два Пространства Выживших, s0 и s1.

Я понимаю, что сборщик копий копирует уцелевшие объекты из Эдема и одного пространства Выживших в другое пространство выживших.

Концептуально должно хватить 2 пробелов, копируя выживших из одного пробела в другой.Я предполагаю, что причина, по которой Java использует 3 пробела, а не только 2, заключается в том, что новые объекты всегда можно создавать в одном и том же месте, в области Eden.

Вопрос в том, почему важно, чтобы new (young-space) объекты должны быть созданы в области Eden, а не, например, после последнего скопированного объекта в пространстве выживших «скопировано в»?

Ответы [ 2 ]

2 голосов
/ 19 сентября 2019

В случае G1 существует только одно пространство для оставшихся в живых (хотя для совместимости JVM сообщает о существовании двух пространств).

При использовании коллектора G1 вся куча является одним пулом, а «функциональные» пространства являются полностью динамическими.Таким образом, место для оставшихся в живых выделяется только для сбора (и становится частью eden после завершения сбора.

Большинство других сборщиков, поддерживаемых в HotSpot JVM, требуют, чтобы «функциональные» пространства имели статические границы, которые определяются при запуске JVM. Таким образом,пустое пространство для выживших не может стать частью рая.

2 голосов
/ 19 сентября 2019

Альтернатива, которую вы предлагаете, имеет два одинаковых новых пробела и копирование из одного в другое.Вы обнаружите, что вам нужно запускать GC нового поколения, когда заполнена половина (всего) нового пространства.

В подходе, используемом GC Oracle, где (обычно) размер Eden> S1 size + S2размер, вы заполнили весь Eden + часть S1 (или S2) к тому времени, когда вы запускаете GC нового поколения.Это будет значительно больше, чем половина всей новой памяти.Другими словами, новая космическая память используется более эффективно.

В этом учебном материале Oracle есть несколько хороших диаграмм, объясняющих, что происходит во время GC нового и старого поколения:

Но учтите, что в руководстве описан упрощенный сборщик поколений.Детали значительно различаются для различных фактических сборщиков, поддерживаемых различными версиями Java.

...