В течение многих лет мы запускали службы Java со скромными размерами кучи, используя +UseParallelOldGC
. Теперь мы начинаем развертывать новую услугу, используя большую кучу и сборщик G1. Все идет хорошо.
Для наших служб, которые используют +UseParallelOldGC
, мы отслеживаем утечки памяти, просматривая размер старого поколения после сбора и оповещения на пороге. Это работает очень хорошо, и на самом деле спас наш бекон всего две недели назад.
В частности, для +UseParallelOldGC
мы делаем следующее:
-
ManagementFactory.getMemoryPoolMXBeans()
- Найдите результат
MemoryPoolMXBean
с именем, заканчивающимся на"Old Gen"
- Сравните
getCollectionUsage().getUsed()
(если доступно) с помощьюgetMax()
К сожалению, похоже, что G1 больше не имеет понятия getCollectionUsage()
.
В принципе, мы хотели бы отслеживать размер кучи G1 после последней смешанной коллекции, которую он хочет делать в смешанном цикле или что-то подобное.
Например, вне VM я был бы доволен awk script, который просто обнаружил, что последний '(mixed)'
был следующим, а затем '(young)'
и посмотрел, какой был последний размер кучи (например, '1540.0M' 'Heap: 3694.5M(9216.0M)->1540.0M(9216.0M)'
)
Есть ли способ сделать это внутри виртуальной машины Java?