Для Sun/Oracle JVM я читал, что GC algo делит новое поколение на один регион Eden и два оставшихся в живых. Мне интересно, почему два выживших региона, а не один? Алго может продолжать пинг-понг между Иденом и только одним выжившим регионом (так, как это происходит в настоящее время между двумя оставшимися в живых); или есть ли недостатки в этом подходе?
Java GC: почему два региона, переживших насилие?
Ответ 1
Я считаю, что реализация JRockit GC работает по большей части, как вы предлагаете, только с одним одиноким и одиноким местом для оставшихся в живых, но не цитируйте меня на этом.
Причиной для JVM HotSpot двух оставшихся в живых является сокращение необходимости иметь дело с фрагментацией. Новые объекты выделяются в пространстве eden. Все хорошо и хорошо. Когда это полно, вам нужен GC, поэтому убивайте устаревшие объекты и переместите живые в пространство для оставшихся в живых, где они могут созреть некоторое время, прежде чем перейти к старому поколению. До сих пор хорошо. В следующий раз, когда мы закончим пространство с эденом, у нас есть головоломка. Следующий GC идет и очищает некоторое пространство как в eden, так и в нашем выжившем пространстве, но пробелы не смежны. Так лучше ли
- Попробуйте установить выживших из eden в отверстия в пространстве для оставшихся в живых, которые были очищены GC?
- Сдвиньте все объекты в пространстве оставшегося в живых, чтобы устранить фрагментацию, а затем переместите выживших в нее?
- Просто скажите: "Вверните его, мы все перемещаем", и скопируйте всех выживших из обоих пространств в совершенно разное пространство - второе пространство для оставшихся в живых - таким образом, вы останетесь с чистое пространство и оставшееся в живых где вы можете повторить последовательность на следующем GC?
Ответ Солнца на вопрос очевиден.
Ответ 2
Роль двух оставшихся в живых пространств меняется на противоположную после операции незначительной сборки мусора
Два выживших пространства. Они содержат объекты, которые пережили по крайней мере одну незначительную сборку мусора, но получили еще один шанс стать недоступным, прежде чем перейти в старое поколение. Только один из них содержит объекты, в то время как другой большую часть времени не используется.
Во время операции незначительной сборки мусора объекты, которые были признаны мусором, будут помечены. Живые объекты в eden, которые выживают в коллекции, копируются в неиспользуемое пространство оставшихся в живых. Живые объекты в используемом пространстве выживших, которому будет предоставлен еще один шанс на восстановление в молодом поколении, также копируются в неиспользованное пространство выживших. Наконец, живые объекты в используемом пространстве выживших, которые считаются "достаточно старыми", передаются старому поколению.
В конце небольшой сборки мусора два пространства выживших меняются ролями. Эдем совершенно пуст; используется только одно место для выживших; и заполняемость старого поколения немного выросла. Поскольку живые объекты копируются во время его работы, этот тип сборщика мусора называется копирующим сборщиком мусора.
Источник: выше приведены выдержки из стр. 83 " Производительности Java " Чарли Ханта и Бину Джона.
Ответ 3
Молодое поколение: Это место, где жил в течение короткого периода времени и делился на два пространства:
Eden space: в пуле памяти будут выделены новые объекты. Предполагается, что большинство объектов становятся разыгранными и становятся недоступными вскоре после их создания. Объекты, не подлежащие разыменованию, будут скопированы сборщиком мусора нового поколения в оставшиеся в живых. Они могут быть скопированы в некоторые особые случаи непосредственно в пул старого поколения.
Оставшиеся в живых: эти два небольших пространства сохраняют выжившие объекты коллекции мусора молодого поколения. Выжившие объекты будут скопированы для (небольшого) количества раз от одного оставшегося в живых до другого. Это позволяет собирать наши более разыменованные объекты.
Старое поколение: Самый большой пул памяти, который должен содержать длинные живые объекты. Объекты копируются в этот пул, когда они покидают оставшиеся в живых пространства.
Генерация приоритетов: Этот довольно неизвестный пул хранит информацию обо всех классах. Это не требует внимания для большинства приложений. Может потребоваться адаптация для некоторых приложений со многими классами. Может потребоваться некоторое внимание, если приложение постоянно загружает и выгружает классы.
Другие преимущества:
- Фрагментация памяти
- Это улучшает производительность GC
Для получения дополнительной информации см. следующие ссылки, которые помогут вам понять больше
Ответ 4
Все текущие ответы на разговоры о фрагментации памяти, это также еще одна причина для генерации в GC.
Среда выполнения записывает все "старые объекты", которые указывают на "новые объекты", это делается каждый раз, когда обновляется поле "указатель". Затем, когда выполняется "шахтерский" GC, необходимо сканировать только "новые" объекты.
С годами было обнаружено, что просто "новых" и "старых" недостаточно, и хорошо иметь третье поколение, которое является "средним возрастом".
Ответ 5
Каковы преимущества и недостатки копирования всех экземпляров поколения из одного пространства в другое, а также их копирование в порядке адресов памяти до начала пространства генерации? Обработка элементов в порядке, вероятно, потребует добавления дополнительного указателя на элемент, но устраняет необходимость в одном из "оставшихся в живых" пространств.
Ответ 6
Два выживших - это реализация алгоритма маркировки и копирования. Они используются в GC для молодого поколения. Как упоминалось Райаном в варианте 3 здесь
Ответ 7
Память кучи в Java Объекты Java, созданные в области, называемой памятью кучи. Куча памяти создается при запуске JVM, память кучи увеличивается или уменьшается при запуске приложения Java. Когда память кучи становится заполненной, сборщик мусора удаляет неиспользуемые объекты, поэтому сборщик мусора освобождает место для новых объектов.
Память кучи разделена на две области (или поколения), называемые
1. Молодое пространство. 2. Старый космос.
1. В молодом пространстве есть пространство Эдема для нового Объекта, и есть два Пространства Выживших (от и до), эти два Пространства Выживших всегда имеют одинаковый размер.
2. Оставшиеся в живых пространства используются для хранения объектов выживания. Когда молодое пространство становится заполненным, сборщик мусора удаляет неиспользуемые объекты, запуская специальную молодую коллекцию, где все объекты, которые жили достаточно долго в молодом пространстве, переводятся (перемещаются) в старое пространство, таким образом освобождая молодое пространство для большего выделения объектов.
3.Если пространство Eden заполнено, GC запустится, если в этом пространстве Eden какие-либо объекты живут, они перемещаются в Survivor Space.
4. В молодом космосе GC обычно использует алгоритм копирования, который быстр, каждый раз объекты выживания копируются в одно из пространств выживших.
5. Если пространство Survivor заполнено, оставшиеся живые объекты напрямую копируются в старое пространство.
6. В старом пространстве GC обычно использует алгоритм Mark-Compact, который работает медленно, но требует меньше памяти.
7. Когда старое пространство становится полным, мусор собирается там, процесс, называемый старой коллекцией. В старом пространстве долгое время жизни Объекты остаются там.
8. Из памяти случится, что для Нового Объекта не будет места, даже для ГХ для ПЕРВОЙ или Пермской части.
9. Объект перемещается во время сбора мусора: eden → оставшийся в живых → tenured (старое место)
Ответ 8
Объекты начинают свое путешествие в Эдем Молодого Поколения. Когда Eden заполняется, выполняется так называемый Minor GC: все потоки приложения останавливаются (пауза stop-the-world), объекты, которые больше не используются, отбрасываются, а все другие объекты из Eden перемещаются в первое пространство Survivor (S0).). В следующий раз, когда выполняется второстепенный GC, объекты переходят из S0 во второе пространство Survivor (S1). Все живые объекты из Эдема также отправляются на S1. Обратите внимание, что это приводит к объектам разного возраста в пространстве Survivor - у нас есть объекты из Эдема и объекты, которые уже были в пространстве Survivor. Следующая итерация Minor GC перемещает объекты из S1 обратно в S0, поэтому пространства Survivor переключают каждый GC. Почему у нас есть два пространства Survivor и почему мы их поменяем? Это довольно просто - когда объект достигает определенного возрастного порога, он превращается в старое поколение. Это приводит к фрагментации пространства Survivor, которая может быть легко устранена путем перемещения всех объектов из S0 в S1 и обратно в каждый второстепенный GC.