Jboss(Java)进程对驻留内存的使用逐渐增加
我们面临一个问题,Java进程的驻留内存逐渐增长。我们将Xmx定义为4096MB,XX:MaxPermSize=1536m。已定义Xss为256K的活动线程数~1500 当应用服务器(JBoss 6.1)启动时,使用的驻留内存约为5.6GB(已使用top命令对其进行监控);它逐渐增长(大约每天0.3到0.5 Gb),直到增长到~7.4 Gb,这时内核的OOM杀手由于RAM空间不足(服务器有9GB的RAM)而终止进程 我们一直在定期监视线程转储-没有线程泄漏的嫌疑。我们仍然无法找出这些额外内存的来源 Pmap输出显示了许多Anon块(除了堆栈和堆的常规块),主要在64 Mb的区域中,这些块在堆、perm gen和堆栈的内存使用方面未被考虑 在堆转储中,我们还尝试查找DirectByteBuffers和sun.misc.Unsafe对象,它们通常用于非堆内存分配,但对象的数量和内存容量似乎都是正常的。即使在对这些对象进行GCD之后,是否仍可能存在未释放的本机内存?任何其他可能导致使用非堆内存的类 我们的应用程序本身确实有本机调用,但某些第三方LIB可能有本机调用Jboss(Java)进程对驻留内存的使用逐渐增加,java,memory-management,memory-leaks,jboss,centos,Java,Memory Management,Memory Leaks,Jboss,Centos,我们面临一个问题,Java进程的驻留内存逐渐增长。我们将Xmx定义为4096MB,XX:MaxPermSize=1536m。已定义Xss为256K的活动线程数~1500 当应用服务器(JBoss 6.1)启动时,使用的驻留内存约为5.6GB(已使用top命令对其进行监控);它逐渐增长(大约每天0.3到0.5 Gb),直到增长到~7.4 Gb,这时内核的OOM杀手由于RAM空间不足(服务器有9GB的RAM)而终止进程 我们一直在定期监视线程转储-没有线程泄漏的嫌疑。我们仍然无法找出这些额外内存的来
你知道是什么导致了这一切吗?还有什么其他细节/工具可以进一步帮助调试这种增长?有什么我们应该注意的已知问题吗?平台:运行在Centos 5.6上的Jboss 6.1 Java和glibc>=2.10(包括Ubuntu>=10.04,RHEL>=6)存在一个已知的问题 解决方法是设置此环境。变量:
导出MALLOC_ARENA_MAX=4
有一篇关于设置MALLOC\u ARENA\u MAX的IBM文章
众所周知,驻留内存以类似于内存的方式爬行
内存泄漏或内存碎片
在谷歌上搜索MALLOC_ARENA_MAX以获取更多参考资料
您可能还需要调整其他malloc选项,以优化分配内存的低碎片:
# tune glibc memory allocation, optimize for low fragmentation
# limit the number of arenas
export MALLOC_ARENA_MAX=2
# disable dynamic mmap threshold, see M_MMAP_THRESHOLD in "man mallopt"
export MALLOC_MMAP_THRESHOLD_=131072
export MALLOC_TRIM_THRESHOLD_=131072
export MALLOC_TOP_PAD_=131072
export MALLOC_MMAP_MAX_=65536
RSS使用量的增加可能是由本机内存泄漏引起的。 一个常见的问题是未关闭
ZipInputStream
/GZIPInputStream
而导致本机内存泄漏
打开ZipInputStream
的一种典型方式是调用Class.getResource
/ClassLoader.getResource
并在java.net.URL
实例上调用openConnection().getInputStream()
,或者调用Class.getResourceAsStream
/ClassLoader.getResourceAsStream
。必须确保这些溪流始终关闭
通过在malloc_CONF
环境变量中指定设置来启用malloc采样评测,可以使用调试本机内存泄漏。有关详细说明,请参阅以下博文:。还有关于使用jemalloc调试java应用程序中的本机内存泄漏的信息
同一个博客还包含关于另一个的信息。假设您已经阅读了Oracle的内存泄漏故障排除指南,那么这个问题是相关的:检查这个答案:,它有关于Java本机内存泄漏的更多详细信息。