Java Metaspace Full GC - PullRequest
       10

Java Metaspace Full GC

0 голосов
/ 01 ноября 2018

У меня проблемы с G1GC.

2400.241: [GC concurrent-root-region-scan-start]
2400.241: [Full GC (Metadata GC Threshold) 2400.252: [GC concurrent-root-region-scan-end, 0.0101404 secs]
2400.252: [GC concurrent-mark-start]
 1151M->603M(4356M), 2.6980537 secs]
   [Eden: 0.0B(2558.0M)->0.0B(2613.0M) Survivors: 55.0M->0.0B Heap: 1151.7M(4356.0M)->603.6M(4356.0M)], [Metaspace: 259187K->92248K(1034240K)]
 [Times: user=3.92 sys=0.00, real=2.70 secs] 

Это занимает много времени, и каждые 20-30 минут полный gc запускается metaspace. Я настроил это так:

  "-XX:MaxMetaspaceSize=768M",
  "-XX:MetaspaceSize=256M"

Но каждый раз, когда он достигает 256M, он запускает полный gc. Когда он достигнет этой первой высшей отметки, не должен ли он в следующий раз увеличиться до максимального размера? Кроме того, полный gc на metaspace запускает полный gc на старом поколении? Я где-то читал, но я не уверен в этом. Это дает время отклика p99 выше, чем я ожидал.

1 Ответ

0 голосов
/ 01 ноября 2018

Согласно Запуск gc в памяти Metaspace в java 8 , полный GC необходим для того, чтобы уменьшить использование metaspace.

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

Когда он достигнет этой первой высшей отметки, не должен ли он в следующий раз увеличиться до максимального размера?

Видимо, нет. Обычная стратегия для сборщиков HotSpot выглядит следующим образом:

  1. выделяйте объекты, пока не достигнете текущего предела кучи
  2. запустить коллектор
  3. посмотрите, сколько места было освобождено, и увеличьте (или уменьшите) размер кучи, если это оправдано.

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

В качестве помощи для этого можно попробовать установить для -XX:MetaspaceSize и -XX:MaxMetaspaceSize одинаковое значение, но это только сделает полные GC менее частыми.

Реальным решением было бы выяснить, что потребляет метапространство, и исправить его.

...