【发布时间】:2015-02-10 21:29:17
【问题描述】:
我们面临的问题是 Java 进程的驻留内存逐渐增长。我们将 Xmx 定义为 4096 MB 和 XX:MaxPermSize=1536m。活动线程的数量 ~1500,定义的 Xss 为 256K。
应用服务器(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 对象,它们通常用于非堆内存分配,但对象的数量以及内存容量似乎是名义上的。即使在这些对象被 GC 之后,是否仍有未释放的本机内存?任何其他可能导致用尽非堆内存的类?
我们的应用程序确实有自己的本机调用,但某些第三方库可能有它们。
关于可能导致此问题的任何想法?还有什么其他细节/工具可以进一步帮助调试这种增加吗?任何我们应该注意的已知问题?平台:在 Centos 5.6 上运行的 Jboss 6.1。
【问题讨论】:
-
假设您已阅读 Oracle 的内存泄漏故障排除指南oracle.com/technetwork/java/javase/tools-141261.html
标签: java memory-management memory-leaks jboss centos