OutOfMemoryError: Metaspace без максимального использования пула памяти

Кажется, что мы столкнулись с OutOfMemoryError: Metaspace перед тем, как фактически исчерпать доступную память для этого пула.

Точнее говоря, мы увидели эту ошибку, как только зафиксированная сумма для этого пула достигла максимума, а не когда использованная сумма достигла максимума.

Вот настройки:

У нас есть сервер Jenkins, работающий на Oracle Java 8 update 121, и у нас есть следующие аргументы metaspace -XX:MetaspaceSize=10G -XX:MaxMetaspaceSize=10G, У нас также есть Datadog, контролирующий пулы кучи и не кучи.

Мы столкнулись с проблемой, когда журнал Jenkins указывал, что какой-то поток выдал ошибку OutOfMemoryError: Metaspace. Однако в Datadog во время инцидента было показано, что количество использованной не-кучи очень низкое (график ниже).

Сначала я думал, что Datadog может измерить его неправильно, но используя jconsole, я получаю соответствующие результаты для текущего использования (у меня не было открытого jconsole во время инцидента).

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

Я что-то упускаю из-за того, как эти пулы памяти должны работать?

Примечание: я прекрасно понимаю, что это довольно большое метапространство, с которого нужно начинать, и что у нас, вероятно, где-то есть утечка загрузчика классов. Это то, что мы ударили, пытаясь исследовать эту утечку.

Отслеживание памяти во время инцидента

0 ответов

Другие вопросы по тегам