java - JBoss 中的内存泄漏

标签 java soap jboss

我在 JBoss 中的行为非常奇怪,我想利用 SO 人群的集体智慧。

我们使用 JBoss(我认为是 4.0.4)来服务 SOAP 调用。事实上,它只是用作美化的 RPC 服务器,仅此而已。当我们有 20 多个客户端同时发送请求时,我们的内存就会耗尽。这些请求由传入的相当小的请求(正确的 SOAP)和返回的结果数据包组成,该结果数据包本质上是一个长 SOAP 字符串(并且该字符串的内容是 XML)。是的,我意识到这不是最理想的。别问。

我已将泄漏追溯到 org.jboss.axis.message.SAX2EventRecorder 的一个实例,该实例包含 400 万个对象(字符串和整数)。现在,即使是最长的响应也不携带 4MB 的数据。请求均小于 40K。那里有些可疑,但我在网上找不到任何文档。

谁能告诉我录音机是做什么用的?我该如何摆脱它?或者可以将其配置为更少的内存需求?如有任何帮助,我们将不胜感激。

<小时/>

更新:澄清一下 - 我确实进行了内存转储,转储显示了一个数组或 4,000,000 多个对象、字符串和整数。该数组由 org.jboss.axis.message.SAX2EventRecorder 所有,而 org.jboss.axis.message.SAX2EventRecorder 又由这些人持有:

org.jboss.axis.message.SOAPEnvelopeAxisImpl@0x19c31fd8(141字节):字段记录器 org.jboss.axis.message.RPCParamElementImpl@0x19c32260(123字节):字段记录器 org.jboss.axis.message.SOAPBodyAxisImpl@0x19c32160(121字节):字段记录器 org.jboss.axis.message.RPCElement@0x19c321e0(124字节):现场记录器 org.jboss.axis.encoding.DeserializationContextImpl@0x19c332f0(67字节):字段记录器 org.jboss.axis.message.SAX2EventRecorder$objArrayVector@0x19c33398(24字节):字段this$0

我们自己的应用程序的数据结构相当臃肿,但还不到这个程度。

另一个更新:权力已经找到了“权力解决方案”:我们正在切换到 64 位内存。欢呼。

最佳答案

使用 JVM arg -XX:-HeapDumpOnOutOfMemoryError 运行。当内存不足时,这将为您提供堆转储。然后,您可以使用jhat工具(它随您的JDK一起提供)分析堆转储。或者,您可以使用jconsole工具(该工具也随您的JDK一起提供)通过内存管理MBean随时请求堆转储。

它会告诉您这 400 万个对象实际包含什么,这可能会让您深入了解软件不释放该内存的原因。

编辑:

看来您并不是唯一遇到此问题的人。已向 Axis 提交 2 个错误报告

AXIS-2698

AXIS-2749

另请参阅AXIS-1771 ,它有一些关于反序列化和调解其影响的方法的有趣信息。您使用的是哪个版本的 Axis?

关于java - JBoss 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/483379/

相关文章:

java - 如何通过通用类从 MongoDB 检索 POJO

ms-access - 从 Access 2007 发出 SOAP 请求

java - JBoss maven插件: deployment fails,依赖项未找到

java - 找不到合适的驱动程序错误

java - 在java中锁定 `properties`文件

java - 从 SOAP wsdl 生成客户端 jar

java - 在 java APP (CXF) 中加载 jks 文件

java - 我可以在一台服务器上拥有多个 Java 应用程序服务器吗?

java - pax-jdbc PostgreSQL JBoss fuse

java - 如何 'getConstructor',其中构造函数签名包含java数组