JAVA GC: почему два выживших региона?


для JVM Sun / Oracle я читал, что GC algo делит новое поколение на один регион Eden и два региона survivor. Мне интересно, почему два выживших региона, а не только один? Algo может продолжать пинг-понг между Eden и только одним оставшимся в живых регионом (как это в настоящее время происходит между двумя оставшимися в живых регионами); или есть какие-либо недостатки в этом подходе?

7 67

7 ответов:

Я считаю, что реализация GC JRockit работает больше, как вы предлагаете, только с одним eden и одним survivor space, но не цитируйте меня по этому поводу.

причина для двух оставшихся в живых пространств HotSpot JVM заключается в уменьшении необходимости иметь дело с фрагментацией. В пространстве Эдема выделяются новые объекты. Все хорошо. Когда это заполнено, вам нужен GC, поэтому убейте устаревшие объекты и переместите живые в пространство survivor, где они могут созреть на некоторое время, прежде чем перейти к старому поколение. Пока все хорошо. Однако в следующий раз, когда мы выбежим из пространства Эдема, у нас будет головоломка. Следующий GC приходит и очищает некоторое пространство как в Эдеме, так и в нашем выжившем пространстве, но пространства не являются смежными. Так что лучше

  1. Попробуйте поместить выживших из Эдема в отверстия в пространстве выживших, которые были очищены GC?
  2. сдвиньте все объекты в пространстве survivor вниз, чтобы устранить фрагментацию, и затем переместить выжившие в нем?
  3. просто скажите: "К черту это, мы все равно перемещаем все вокруг", и скопируйте всех выживших из обоих пространств в совершенно отдельное пространство-второе пространство выживших-таким образом, оставив вас с чистым Эдемом и выжившим пространством, где вы можете повторить последовательность на следующем GC?

ответ Солнца на этот вопрос очевиден.

роль двух оставшихся в живых пространств отменяется после операции незначительной сборки мусора

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

во время работы второстепенной сборки мусора, объекты то, что было обнаружено как мусор, будет помечено. Живые объекты в Эдеме, которые переживают коллекцию, копируются в неиспользуемое пространство survivor. Живые объекты в используемом пространстве выживания, которым будет дан еще один шанс быть восстановленными в молодом поколении, также копируются в неиспользуемое пространство выживания. Наконец, живые объекты в пространстве выживания, которое используется, которые считаются "достаточно старые", продвигаются к старому поколению.

в конце второстепенного мусора коллекция, два оставшихся в живых пространства меняются ролями. Эдем совершенно пуст; используется только одно оставшееся в живых пространство; и заполняемость старого поколения немного выросла. Поскольку живые объекты копируются во время его работы, этот тип сборщика мусора называется копирующим сборщиком мусора.

источник: выше приведены выдержки из стр. 83 Производительность Java, Чарли Хант и Бину Джон.

Молодое Поколение : это место, где жили в течение короткого периода и разделены на два пространства:

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

пробелов оставшегося в живых: эти два небольших пространства хранят уцелевшие объекты сбора мусора молодого поколения. Уцелевшие объекты будут скопированы в течение (небольшого) количества раз из одного оставшегося в живых в другой. Это позволяет собирать наши более разыменованные объекты.

старое поколение: самый большой пул памяти, который должен содержать длинные живые объекты. Объекты копируются в этот пул, как только они покидают оставшегося в живых пространства.

поколение Permament: этот довольно неизвестный пул хранит информацию обо всех классах. Она не требует никакого внимания для большинства приложений. Возможно, его придется адаптировать для некоторых приложений со многими классами. Это может также потребовать некоторого внимания, если приложение постоянно загружает и выгружает классы.

другие преимущества:

  • фрагментации памяти
  • это улучшает производительность GC

пожалуйста, найти следующие ссылки для получения более подробной информации, которая может помочь вам понять больше

http://www.scalingbits.com/javaprimer

http://java.sys-con.com/node/84695

все текущие ответы говорят о фрагментации памяти, это также еще одна причина иметь поколения в GC.

среда выполнения записывает все "старые объекты", которые указывают на" новые объекты", это делается каждый раз, когда обновляется поле" указатель". Затем, когда GC" miner "сделан, нужно сканировать только" новые " объекты.

за эти годы было обнаружено, что просто иметь "новый" и "старый" недостаточно, и хорошо иметь 3-е поколение ,которое является " средним престарелый."

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

два оставшихся в живых являются реализацией алгоритма метки и копирования. Они используются в ГК для молодого поколения. Как упоминал Райан в варианте 3 здесь

enter image description here

память "кучи" в Java Объекты Java, созданные в области, называемой памятью кучи.Память кучи создается при запуске JVM, память кучи увеличивается или уменьшается при запуске приложения java. Когда память кучи заполняется, сборщик мусора удаляет неиспользуемые объекты, таким образом сборщик мусора создает пространство для новых объектов.

память кучи разделена на две области (или поколения) под названием

1.молодой космос. 2.старые пространства.

1.In молодое пространство, есть пространство Эдема для нового объекта, и есть два пространства выживания(от и до), Эти два пространства выживания всегда одинакового размера.

2.Выжившие пространства используются для хранения объектов выживания.Когда пространство young заполняется, сборщик мусора удаляет неиспользуемые объекты, запустив специальную коллекцию young, где все объекты, которые достаточно долго жили в пространстве young, продвигаются (перемещаются) в старое пространство,тем самым освобождая пространство young для большего количества объектов распределение.

3.Если пространство Эдема заполнено, GC будет работать, если какие-либо объекты живут в этом пространстве Эдема, они перемещаются в пространство выживания.

4.In young space, GC обычно используют алгоритм копирования, который является быстрым, каждый раз, объекты выживания копируются в один из оставшихся в живых пространства.

5.Если пространство Survivor заполнено, остальные живые объекты напрямую копируются в старое пространство.

6.In старое пространство, GC nornally использует алгоритм Mark-Compact, который медленный, но требуется меньше памяти.

7.Когда старое пространство становится полным мусора собирается там, процесс называется Старый collection.In старое пространство, Да здравствует время объекты остаются там.

8.Из памяти произойдет, что нет места для нового объекта даже GC, сделанного для старой или пермской части.

9.Объект перемещается во время сборки мусора: eden -> survivor -> tenured(old space)