Java本机内存泄漏G1和巨大的内存

时间:2017-08-04 15:37:21

标签: java memory-leaks g1gc jemalloc

我们目前遇到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,它给了我们图表:

INUSE空间inuse-space

INUSE对象inuse-objects

我不知道这里的问题是什么,有人有想法吗?

如果我设置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

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我们从未明确调用过System.gc(),同时停止使用G1,没有指定xms和xmx以外的任何内容。

因此现在几乎所有的128G都用于堆。 java进程内存使用率很高 - 但是持续数周。我确定这是G1或至少一般的GC问题。这个"解决方案的唯一缺点是#34;是高GC暂停,但随着堆的增加,它们从高达90秒减少到大约1-5秒,这对于我们使用我们的服务器驱动的基准测试是可以的。

在此之前,我玩了-XX:ParallelGcThreads选项,当从28(默认为40 cpus)下降到1时,对内存泄漏速度有显着影响。内存图看起来有点像使用不同值的手扇在不同的实例上......

enter image description here