【问题标题】:Memory leak in JBossJBoss 中的内存泄漏
【发布时间】:2009-01-27 13:23:33
【问题描述】:

我在 JBoss 中有一个非常奇怪的行为,我想利用 SO Crowd 的集体智慧。

我们使用 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.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 位内存。欢呼。

【问题讨论】:

  • @Arkadiy:不要假设 JBoss 中存在错误;假设错误在您的代码中。您已经确定了软件的一种“次优”条件。为什么不能有更多?
  • 我的问题是:你在运行这么旧版本的 JBoss 做什么?这是2.5岁。您经常会发现人们对使用过时的软件感到犹豫甚至不愿提供帮助。
  • @Gortok - 我确实承担了我们自己的错,但是那个该死的数组负责一半的内存使用,它与我们无关。而且,它的保存方式(请参阅更新)可能会为每个正在进行的请求分配它 - 这解释了为什么我们只有在一定数量的请求正在进行时才会失败。
  • @cletus: - “企业”环境 - 三个大洲的三个开发团队,没有人准备好承担责任。
  • 我刚刚在类似的事情上运行了一个带有 bea 支持的案例。他们做任何事情所需的信息是:JRA 记录、MissionControl MemLeak 屏幕截图、垃圾收集日志和来自 jvm 的任何转储文件

标签: java soap jboss


【解决方案1】:

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

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

编辑:

看来你不是唯一一个遇到这个问题的人。 Axis 提交了 2 个错误报告

AXIS-2698

AXIS-2749

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

【讨论】:

  • 你认为我如何确定 SAX2EventRecorder 是罪魁祸首?该死的,这里的人都习惯了新手问题,并没有期望更好。
  • 支持投票:Arkadiy,这可能对您没有帮助,但是您对问题的表述方式使它成为“新手”,特别是因为标题是“JBoss 中的内存泄漏”。使用商业工具的第一条规则是假设错误存在于您的代码中;不是商业工具。
  • 我只能使用您提供的信息。也许你下次应该更具体。无论如何,SAX2EventRecorder 中的对象的内容是什么?
  • 是的,必须承认:尽管答案可能已经涵盖了您所做的事情,但对其投反对票然后抨击海报让我认为“您是靠自己的伙伴”。
  • @kevin:引用问题:SAX2EventRecorder 包含 400 万个对象(字符串和整数)。内容就是这样。
【解决方案2】:

如果可以,请在 Java 6 下运行应用程序。最新版本包括用于分析的 VisualVM。它应该能够显示内存的增长。您可以附加到 Java 5 虚拟机,但它不会显示那么多。

【讨论】:

    猜你喜欢
    • 2017-07-14
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2015-12-01
    相关资源
    最近更新 更多