Запустив процесс Hadoop namenode на JDK 1.8.0.92 с Xmx и Xmx = 75Gb, мы наблюдали скачок системной памяти в интервале x. И медленно произошло ООМ.
В процессе отладки мы обнаружили следующее:
RSS превысил Xmx
Это куча - нет, это не куча (можно увидеть использование в JMX, который находится под контролем)
Это не куча или утечка - из дампа кучи и jmap -histo утечка не наблюдается.
Тогда что? Включен NMT в окружающем режиме.
Тогда что?
Видно, что рост происходит на внутреннем разделе родной памяти
И эта схема выглядит следующим образом: когда число потоков достигло высокого значения, объем выделенной памяти увеличивался и постепенно увеличивался.
Исправления:
Пробовал -XX: MaxDirectMemorySize = 3g (без изменений все еще нарушается ограничение)
Пробовал -Djdk.nio.maxCachedBufferSize (пробовал с jdk1.8.0.192 при включении этой опции все еще наблюдается утечка)
MALLOC_ARENA_MAX - по умолчанию это значение равно 4 на Hadoop-configs.sh, попытка с 1 и 2, утечка все еще происходит.
Вопросы
Как управлять внутренним разделом родной памяти?
Как перечислить причину этой проблемы и использование этого внутреннего раздела?
Как определить значение Malloc в JVM?