У меня проблемы с 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. Я настроил это так:

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

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

0
Bruno Manzo 1 Ноя 2018 в 16:00

1 ответ

Лучший ответ

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

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

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

Очевидно нет. Обычная стратегия сборщиков HotSpot выглядит так:

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

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

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

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

4
Stephen C 28 Май 2020 в 09:25