Jboss(Java)进程对驻留内存的使用逐渐增加

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)而终止进程 我们一直在定期监视线程转储-没有线程泄漏的嫌疑。我们仍然无法找出这些额外内存的来

我们面临一个问题,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可能有本机调用


你知道是什么导致了这一切吗?还有什么其他细节/工具可以进一步帮助调试这种增长?有什么我们应该注意的已知问题吗?平台:运行在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本机内存泄漏的更多详细信息。