JVM (6) Почему новое поколение имеет два раздела Survivor?

Java JVM

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

Сборщик поколений разделит пространство памяти на две области: старое поколение и новое поколение, а новое поколение будет разделено на: область Эдема и две области 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.