В настоящее время у нас есть проблемы с утечкой собственной памяти Java. Сервер довольно большой (40 процессоров, 128 ГБ памяти). Размер кучи Java составляет 64 ГБ, и мы запускаем приложение с очень интенсивным использованием памяти, считывающее большое количество данных в строки с примерно 400 потоками и выбрасывающее их из памяти через несколько минут.
Таким образом, куча заполняется очень быстро, но содержимое кучи устаревает и может быть очень быстро собрано. Таким образом, мы должны использовать G1, чтобы не было перерывов STW в течение нескольких минут.
Теперь, кажется, это работает нормально - куча достаточно велика, чтобы запускать приложение в течение нескольких дней, здесь ничего не протекает. В любом случае, процесс Java растет и растет с течением времени, пока не будут использованы все 128G, и приложение не выйдет из строя из-за сбоя распределения.
Я много читал об утечках памяти в java, в том числе о проблеме glibc с max. арены (у нас есть wheezy с glibc 2.13, поэтому здесь невозможно исправить, установив MALLOC_ARENA_MAX=1 или 4 без обновления дистрибутива).
Итак, мы попробовали jemalloc, который дал нам графики для:
Я не понимаю, в чем здесь проблема, у кого-нибудь есть идеи?
Если я установлю MALLOC_CONF="narenas:1" для jemalloc в качестве параметра среды для процесса tomcat, выполняющего наше приложение, может ли он все равно каким-то образом использовать версию glibc malloc?
Это наша установка G1, может здесь какая-то проблема?
-XX:+UseCompressedOops
-XX:+UseNUMA
-XX:NewSize=6000m
-XX:MaxNewSize=6000m
-XX:NewRatio=3
-XX:SurvivorRatio=1
-XX:InitiatingHeapOccupancyPercent=55
-XX:MaxGCPauseMillis=1000
-XX:PermSize=64m
-XX:MaxPermSize=128m
-XX:+PrintCommandLineFlags
-XX:+PrintFlagsFinal
-XX:+PrintGC
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintTenuringDistribution
-XX:-UseAdaptiveSizePolicy
-XX:+UseG1GC
-XX:MaxDirectMemorySize=2g
-Xms65536m
-Xmx65536m
Спасибо за вашу помощь!