如何在Jboss AS 5.1中追踪非堆JVM内存泄漏?

5
升级到JBoss AS 5.1后,运行JRE 1.6_17,CentOS 5 Linux,在约8小时后(32位系统上的最大值为3G),JRE进程会耗尽内存。这在负载适中的集群中的两个服务器上都会发生。Java堆使用量稳定下来,但整个JVM占用空间仍然不断增长。线程计数非常稳定,并且以128K设置线程堆栈大小为370线程的最大值。
JVM的占用空间达到3G,然后出现以下错误:
java.lang.OutOfMemoryError: requested 32756 bytes for ChunkPool :: allocate。交换空间用完了吗?
内部错误(allocation.cpp:117),pid = 8443,tid = 1667668880 错误:ChunkPool :: allocate 当前JVM内存参数为:
-Xms1024m -Xmx1024m -XX:MaxPermSize = 256m -XX:ThreadStackSize = 128
鉴于这些设置,我希望进程占用空间能够稳定在1.5G左右。但实际情况是,它会持续增长,直到达到3G。
似乎没有标准的Java内存工具可以告诉我JVM本地端正在消耗所有这些内存(例如Eclipse MAT,jmap等)。 PID上的Pmap只给我一堆[anon]分配,这并没有真正帮助我。据我所知,当没有JNI或java.nio类加载时,这种内存问题就会发生。
如何排除JVM的本地/内部方面,以查找所有非堆内存去向?
谢谢!我很快就会用尽主意,每8小时重新启动应用程序服务器不会是一个很好的解决方案。

“运行内存不足”是什么意思?有哪些症状?是否会出现异常?如果有,是否会得到堆栈跟踪? - skaffman
是的,JVM已经崩溃了,因为它已经增长到了3G——这是32位Linux系统上的最大限制。我已经将错误添加到问题中。谢谢。 - walton
哇,一个热点崩溃....这绝对是不应该发生的,即使在内存紧张的情况下也不行。可惜的是,非堆内存池无法通过分析接口暴露出来,所以其中的内容仍然是个谜。 - skaffman
这很有趣:http://www.codingthearchitecture.com/2008/01/14/jvm_lies_the_outofmemory_myth.html - skaffman
谢谢。PMAP只给我分散的[匿名]分配,这会导致3G进程限制。我认为我正在看两个可能的问题之一:
  1. Java对象没有释放本地资源(最有可能)
  2. JVM本地内存泄漏。(不太可能,因为我在1.6.16和1.6.17上都看到了这个问题)
追踪#1一直是具有挑战性的部分。
- walton
显示剩余2条评论
3个回答

0

正如@Thorbjørn建议的那样,对您的应用程序进行性能分析。

如果您需要更多的内存,可以选择64位内核和JVM。


-1

Walton: 我曾经遇到过类似的问题,在https://community.jboss.org/thread/152698中发布了我的问题和发现。 请尝试在Java启动参数中添加-Djboss.vfs.forceCopy=false,看看是否有帮助。 警告:即使它减少了进程大小,您仍需要进行更多测试以确保一切正常。


-1

使用JDK中的Jvisualvm来了解正在进行的操作。jvisualvm可以附加到正在运行的进程。


但是 Visual VM 只查看堆,除了 perm gen 之外,它对其他任何东西都没有什么帮助。 - duffymo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接