我们目前遇到java本机内存泄漏问题。服务器很大(40cpus,128GB内存)。 Java堆大小为64G,我们运行一个内存非常密集的应用程序,将大量数据读取到大约400个线程的字符串,并在几分钟后将它们从内存中丢弃。
因此堆填充速度非常快,但堆上的东西已经过时,并且GC的速度也非常快。所以我们必须使用G1才能在几分钟内没有STW中断。
现在,这似乎工作得很好 - 堆足够大,可以运行应用程序好几天,没有泄漏到这里。无论如何,Java进程随着时间的推移而不断增长和发展,直到使用所有128G并且应用程序因分配失败而崩溃。
我已经阅读了很多关于本机java内存泄漏的内容,包括max的glibc问题。 arenas(我们有glibc 2.13,所以没有修复可能在这里设置MALLOC_ARENA_MAX = 1或4没有dist升级)。
所以我们尝试了jemalloc,它给了我们图表:
我不知道这里的问题是什么,有人有想法吗?
如果我设置MALLOC_CONF =" narenas:1"对于运行我们的应用程序的tomcat进程的jemalloc作为环境参数,无论如何仍然可以使用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
感谢您的帮助!
答案 0 :(得分:0)