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

Posted

技术标签:

【中文标题】如何在 Jboss AS 5.1 中追踪非堆 JVM 内存泄漏?【英文标题】:How can a track down a non-heap JVM memory leak in Jboss AS 5.1? 【发布时间】:2010-01-12 21:14:36 【问题描述】:

升级到 JBoss AS 5.1、运行 JRE 1.6_17、CentOS 5 Linux 后,JRE 进程在大约 8 小时后内存不足(在 32 位系统上达到 3G 最大值)。这发生在集群中处于中等负载下的两台服务器上。 Java 堆使用量稳定下来,但整个 JVM 占用空间仍在继续增长。线程数非常稳定,最多可达到 370 个线程,线程堆栈大小设置为 128K。

JVM的footprint达到3G,然后就死了:

java.lang.OutOfMemoryError:为 ChunkPool::allocate 请求了 32756 字节。交换空间不足?

  内部错误(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 小时重新启动一次应用服务器并不是一个很好的解决方案。

【问题讨论】:

“内存不足”是什么意思?有什么症状?例外?如果是这样,你会得到堆栈跟踪吗? 是的,JVM 死了,因为它已经增长到 3G - 32 位 Linux 系统上的最大值。我将错误添加到问题中。谢谢。 哇,一个热点崩溃......这应该永远发生,即使它的内存不足。遗憾的是,非堆内存池没有通过分析接口公开,所以内容仍然是个谜。 这很有趣:codingthearchitecture.com/2008/01/14/… 这个问题可能对您有所帮助:***.com/questions/1888351 这种情况下的 OP 在 HP 上运行,所以我没有将您的问题标记为骗子,但我怀疑答案是一样的(升级JVM)。我的回复指向pmap,这是一个检查虚拟内存空间的工具。 【参考方案1】:

按照@Thorbjørn 的建议,分析您的应用程序。

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

【讨论】:

【参考方案2】:

在 JDK 中附加 Jvisualvm 以了解发生了什么。 jvisualvm 可以附加到正在运行的进程。

【讨论】:

但是Visual VM只看堆;除了 perm gen,它几乎不会告诉你其他任何事情。【参考方案3】:

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

【讨论】:

以上是关于如何在 Jboss AS 5.1 中追踪非堆 JVM 内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

如何关闭 JBoss AS 7 服务器?

jdk的内存设置

JBoss AS 7中的server.xml等价物

JBoss 5.1:使用 JPA 休眠

如何修改 JBoss AS 7.1 上内置的 h2 数据库?

如何使用 Maven 在 MANIFEST.MF 中为 JBoss AS 7 生成模块依赖项?