【问题标题】:Apache Servicemix - Heapspace issue - How to resolve?Apache Servicemix - 堆空间问题 - 如何解决?
【发布时间】:2014-03-26 13:45:32
【问题描述】:

我们在生产中有一个 apache servicemix 实例(版本 3.3.1),它运行我们的 bpel 流(使用 apache ode 1.3.5 )和一些骆驼代码(用于路由)。问题是,servicemix 进程的已用堆空间不断增加。最终它耗尽空间并崩溃。因此,我们必须每 7-8 天重新启动一次流程。 (这很烦人)

目前进程的jvm内存配置如下
-Xms512M -Xmx2048M -XX:PermSize=512m -XX:MaxPermSize=1024m

我们有另一个 servicemix 实例,它具有相同的内存配置,但运行在稍小的负载下,运行大约 20-22 天,然后才超过分配的堆空间。显然,这个负载较小有助于它延长运行时间。

我的问题

  1. 有没有人在使用上述版本的 apache servicemix 时遇到过同样的问题?
    (最初我想确定是容器相关的泄漏还是应用程序相关的问题)

  2. 你如何解决这个问题?有没有我可以申请找出问题的方法?如果是这样,任何人都可以列出相同的步骤吗?
    (网络上的内存泄漏解决文章似乎更多地强调导致内存泄漏的理论,而不是应该采取的解决步骤)

需要您对此的想法、建议和意见。

谢谢,
阿伦乔利

【问题讨论】:

    标签: java memory-leaks jvm jvm-arguments apache-servicemix


    【解决方案1】:

    通常当我们遇到这个问题时,我们会生成一个堆转储文件,堆转储是Java进程在某个时间点的内存快照。保存这些数据有不同的格式,根据格式的不同,它可能包含不同的信息,但一般来说,快照包含有关触发快照时堆中的 java 对象和类的信息。

    生成堆转储文件的方法有很多,但在您的情况下,您可以添加此参数以在发生OutOfMemoryError 时自动生成堆转储文件:

    -XX:+HeapDumpOnOutOfMemoryError
    -XX:HeapDumpPath=[HeapDirPath]
    

    所以这个文件可以让你找出填满整个空间的对象是什么,然后你会很容易地找出导致内存泄漏的代码。

    您可以使用Eclipse memory Analyzer来分析此类转储文件。

    【讨论】:

      【解决方案2】:

      根据我的经验,ServiceMix 3 的这种类型的内存问题通常表明 MEP 处理流程中的组件或端点之一存在问题。一些 JBI 组件、端点和服务保留一个待处理交换的列表,因此如果其中一些消息交换模式未能正确终止,这些交换将永远不会从列表中删除。

      解决此问题的最佳方法是进行堆转储(例如使用 jmap),然后查看其中的 MessageExchange 实现实例。您可能会发现一堆非常相似的 MessageExchange 被保存在内存中。一旦你有了这些,你就可以查看交换属性来找出导致问题的端点/组件。

      在后来的 ServiceMix 3.x 版本中还修复了一些可能是导致此问题的问题。请务必试一试 3.4.1 版本或查看更新版本的发行说明。

      【讨论】:

      • 谢谢格特。您能否更具体地了解我应该在堆转储中查找的 MEP 实现实例?我们使用的组件是 - 嵌入式 activemqcamel 组件,用于从队列路由到 bpel 流,apache ode 组件用于运行流以及 http 提供程序 组件,用于流调用在 servicemix 环境之外托管的 Web 服务,
      • 每个受支持的 MEP 都有一个特定的 MessageExchange 实现类。我会留意org.apache.servicemix.jbi.messaging.InOnlyImpl/InOutImpl/InOptionalOutImpl/RobustInOnlyImpl 实例。或者,您也可以查看所有这些的底层值对象,称为org.apache.servicemix.jbi.messaging.ExchangePacket
      • 嗯..这是非常好的信息。只是好奇(我知道我们正在超出这个问题的范围)......我已经广泛测试了我们的设置,并且我们从未错过我们推送到 servicemix 中的任何请求(即所有请求都成功完成整个流程)..那么怎么会有 mep 实现坚持交换对象?您是否表示即使在消息传递之后,组件或端点仍可能继续保持交换对象?
      • 所有 MEP 都必须以 DONE 或 ERROR 消息结束。例如:一个 InOnly 交换首先以 ACTIVE 状态发送到目标端点 - 在它被处理之后,该端点负责发回 DONE 消息。如果目标端点没有回复该 DONE 状态,则看起来一切都从外部正确发生,而前一个端点仍在等待 DONE 消息到达。话虽这么说,很多时候,问题出在 JBI 组件而不是您自己的代码中,所以我认为您肯定想试一试 3.4.1 版本。
      • 是的..我已经下载了 3.4.1 版本,我们已经开始在其中测试我们的应用程序。但是在我将容器从 3.3.1 迁移到 3.4.1 之前,我需要解决我的产品利益相关者现在困扰我们的确切问题,并说服他们(通过数据)为什么需要迁移。非常感谢 gert,您的意见非常有帮助,我们会带着结果返回这个论坛。
      猜你喜欢
      • 2020-10-07
      • 2022-01-12
      • 2011-11-25
      • 2012-03-20
      • 2012-02-15
      • 2018-12-27
      • 2016-06-05
      • 2011-11-05
      • 2020-04-11
      相关资源
      最近更新 更多