Большинство приложений Java создают объекты Java, а затем довольно быстро их отбрасывают, например. вы создаете несколько объектов в методе, а затем, как только вы выходите из метода, все объекты умирают. Большинство приложений ведут себя таким образом, и большинство людей склонны кодировать свои приложения таким образом. Куча Java примерно разбита на 3 части: постоянное, старое (долгоживущее) поколение и молодое (недолговечное) поколение. Молодой ген далее разбивается на S1, S2 и Eden. Это просто кучи.
Большинство объектов создано в молодом поколении. Идея заключается в том, что, поскольку уровень смертности объектов высок, мы быстро создаем их, используем их, а затем отбрасываем их. Скорость имеет важное значение. Когда вы создаете объекты, молодой ген заполняется до тех пор, пока не произойдет незначительный сборщик мусора. В второстепенном GC все живые объекты копируются из eden и передаются от S2 до S1. Затем указатель опирается на Eden и S2.
Каждая копия стареет объект. По умолчанию, если объект выживает 32 копии, а именно. 32 второстепенных GC, затем GC полагает, что это будет продолжаться намного дольше. Итак, что он делает, это удерживает его, передав его старому поколению. Старый ген - это только одно большое пространство. Когда старый ген заполняется, в старом поколении происходит полный или большой сборщик мусора. Поскольку нет другого места для копирования, GC должен сжаться. Это намного медленнее, чем второстепенный сборщик мусора, поэтому мы избегаем этого чаще.
Вы можете настроить параметр владения с помощью
java -XX:MaxTenuringThreshold=16
если вы знаете, что у вас много долгоживущих объектов. Вы можете распечатать различные возрастные группы вашего приложения с помощью
java -XX:-PrintTenuringDistribution