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 во время инцидента).
Мое единственное другое заключение заключалось в том, что ошибка возникла из-за попытки выделить больше выделенного метапространства, хотя между этим и использованным количеством все еще остается большой разрыв.
Я что-то упускаю из-за того, как эти пулы памяти должны работать?
Примечание: я прекрасно понимаю, что это довольно большое метапространство, с которого нужно начинать, и что у нас, вероятно, где-то есть утечка загрузчика классов. Это то, что мы ударили, пытаясь исследовать эту утечку.