В этой статье будет использоваться метод исключения для объяснения территориального деления нового поколения, чтобы читатели могли более четко понять принцип коллектора поколений.Прежде чем мы начнем, давайте взглянем на коллектор поколений в целом.
Сборщик поколений разделит пространство памяти на две области: старое поколение и новое поколение, а новое поколение будет разделено на: область Эдема и две области Survivor (From Survivor, To Survivor), посмотрите на диаграмму распределения пространства памяти , следующим образом:
(Изображение предоставлено fancydeepin)
Видно, что соотношение разделов Eden и Survivor по умолчанию составляет 8:1:1, это значение можно установить: –XX:SurvivorRatio, значение по умолчанию: –XX:SurvivorRatio=8.
Кстати, соотношение памяти нового поколения и старого поколения по умолчанию составляет 1:2, что можно установить с помощью: -XX:NewRatio.
Почему выживший раздел не может быть 0?
Если Survivor равен 0, то есть новое поколение имеет только один раздел Eden.После каждой сборки мусора уцелевшие объекты попадут в старое поколение, так что пространство памяти старого поколения будет быстро заполнено, что запустить самый трудоемкий Full GC, очевидно эффективность такого сборщика для нас совершенно неприемлема.
Почему не может быть 1 раздел Survivor?
Если раздел Survivor равен 1, предполагая, что мы делим два региона на 1: 1, то половина пространства памяти в любой момент простаивает Очевидно, использование пространства слишком низкое и не лучшее решение.
А вот если соотношение объема памяти установить 8:2, то это как раз кажется "хорошим", если предположить, что память молодого поколения 100 Мб (размер Survivor 20 Мб), а сейчас 70 Объекты МБ после сборки мусора,оставшиеся активные Объект находится на 15 МБ в Survivor области.На данный момент доступного пространства памяти нового поколения всего 5 МБ,поэтому операция сборки мусора будет выполнена в ближайшее время.Очевидно,самая большая проблема этого сборщика мусора в том, что он нуждается в частой сборке мусора.
Почему в Survivor 2 раздела?
Если раздел Survivor имеет 2 раздела, мы можем установить соотношение памяти для разделов Eden, From Survivor и To Survivor равным 8:1:1, тогда коэффициент использования памяти нового поколения в любое время составляет 90%, поэтому пространство Коэффициент использования в основном соответствует ожидаемому. Кроме того, большинство объектов виртуальной машины соответствуют характеристикам «живых и умирающих», поэтому каждый новый объект генерируется в области Эдема с относительно большим пространством.После сборки мусора уцелевшие методы объекта сохраняются в Survivor. , если это объект, который выживает в зоне Survivor, то «возраст» будет +1, а когда возраст увеличится до 15 (можно установить -XX:+MaxTenuringThreshold), объект будет улучшен до старое поколение.
Суммировать
Согласно приведенному выше анализу, при наличии двух разделов Survivor в новом поколении оптимальны как использование пространства, так и эффективность работы программы, поэтому существует два раздела Survivor.