Сборка мусора Java - новый порог - PullRequest
0 голосов
/ 04 июля 2018

Я полагаю, что объекты в Молодом Поколении должны выжить в 15 второстепенных ГК (максимум 15), прежде чем они будут повышены до Старого Поколения или Поколенного Поколения.

Что означает новый порог и как он влияет на GC молодого поколения JVM или на незначительный GC?

Означает ли это, что «Молодое поколение» недостаточно велико для того, чтобы JVM выполнила 15 ГХ на объектах?

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

Desired survivor size 121634816 bytes, new threshold 10 (max 15)
PSAdaptiveSizePolicy::compute_eden_space_size: costs minor_time: 0.004921 major_cost: 0.047628 mutator_cost: 0.947450 throughput_goal: 0.990000 live_space: 330899520 free_space: 1115684864 old_eden_size: 419430400 desired_eden_size: 436207616
AdaptiveSizePolicy::survivor space sizes: collection: 28 (125829120, 113246208) -> (125829120, 121634816) 
AdaptiveSizeStop: collection: 28 
[PSYoungGen: 421856K->10080K(532480K)] 785165K->373389K(1269760K), 0.0312765 secs] [Times: user=0.25 sys=0.00, real=0.03 secs] 
2018-07-04T02:09:01.886+0800: 359.263: [GC (Allocation Failure) AdaptiveSizePolicy::update_averages:  survived: 4587536  promoted: 0  overflow: false
AdaptiveSizeStart: 359.286 collection: 29 
  avg_survived_padded_avg: 111951304.000000  avg_promoted_padded_avg: 43516000.000000  avg_pretenured_padded_avg: 41.070663  tenuring_thresh: 11  target_size: 113246208

1 Ответ

0 голосов
/ 04 июля 2018

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

Есть два места для выживших; один - это пространство «от» (в настоящее время содержит объекты), а другой - пространство «на» (фактически пустое). Живые данные из Eden копируются в пространство «to», а также любые объекты, которые еще живы и не достигли нового порога в пространстве «from». Роли двух оставшихся в живых пространств затем меняются местами («до» становится «из», «от» становится «до») и готовятся к следующему второстепенному ГК.

Объекты в пространстве выживших, которые достигли нового (часто называемого владением) порога, переводятся в старое поколение.

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

Вы можете настроить размер регионов с помощью различных параметров. Прочитайте это для более подробной информации:

https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/sizing.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...