我在 JBoss 中有一个非常奇怪的行为,我想利用 SO Crowd 的集体智慧。
我们使用 JBoss(我认为是 4.0.4)来服务 SOAP 调用。事实上,它被用作美化的 RPC 服务器,仅此而已。当我们有 20 多个客户同时发送他们的请求时,我们的内存就会用完。这些请求由传入的相当小的请求(正确的 SOAP)和返回的结果包组成,该包本质上是一个长 SOAP 字符串(并且字符串的内容是 XML)。是的,我意识到这是次优的。不要问。
我已经将泄漏追踪到一个包含 400 万个对象(字符串和整数)的 org.jboss.axis.message.SAX2EventRecorder 实例。现在,即使是最长的响应也不携带 4MB 的数据。请求都小于 40K。那里有些可疑,但我在网上找不到任何文档。
谁能告诉我录音机是干什么用的?我该如何摆脱它?或者可以将其配置为更少占用内存?任何帮助表示赞赏。
更新:澄清一下——我确实做了内存转储,转储显示了一个数组或 4,000,000 多个对象、字符串和整数。该数组由 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
我们自己的应用程序的数据结构非常臃肿,但还没有到这种程度。
另一个更新:powers that be 找到了“powers-that-be-solution”:我们正在切换到 64 位内存。欢呼。