我们有一个apache 实例(版本3.3.1),它运行我们的bpel流(使用ApacheOD1.3.5 )和一些骆驼代码(用于路由)。问题是,使用的服务器进程的堆空间不断增加。最终它耗尽了空间并坠毁了。因此,我们不得不每7-8天重新开始这个过程。(这很烦人)
该进程当前的jvm内存配置如下
-Xms512M -Xmx2048M -XX:PermSize=512m -XX:MaxPermSize=1024m
我们有另一个具有相同内存配置的servicemix实例,但是在较小的负载下运行,在超过分配的堆空间之前运行了大约20-22天。显然,这个负载越小,它的扩展运行就越好。
我的问题
需要你的想法,建议和建议。
谢谢,
阿伦·乔利
发布于 2014-03-26 13:56:40
通常,当我们面对这个问题时,我们会生成一个堆转储文件,堆转储是Java进程在某个时间点的内存的快照。持久化此数据有不同的格式,根据格式的不同,它可能包含不同的信息,但通常快照包含有关触发快照时堆中的java对象和类的信息。
生成堆转储文件的方法很多,但在您的示例中,您可以在发生OutOfMemoryError时添加这些参数来自动生成堆转储文件:
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=[HeapDirPath]因此,这个文件将允许您找出填充整个空间的对象是什么,然后您将很容易地找出导致内存泄漏的代码。
您可以使用Eclipse memory Analyzer来分析这种转储文件。
发布于 2014-03-26 14:20:02
在我的经验中,ServiceMix 3的这种类型的内存问题常常表明您的流中的一个组件或端点的MEP处理存在问题。一些JBI组件、端点和服务保留了一个挂起的交换列表,因此如果某些消息交换模式未能正确终止,这些交换将永远不会从列表中删除。
解决这一问题的最佳方法是采取堆转储(例如使用jmap),然后查看其中的MessageExchange实现实例。您可能会发现一堆非常类似的MessageExchanges保存在内存中。有了这些之后,就可以查看exchange属性,找出是哪个端点/组件导致了问题。
在后来的ServiceMix 3.x版本中也存在一些问题,可能是造成这一问题的原因。一定要对3.4.1版本进行检查,或者查看最新版本的发行说明。
https://stackoverflow.com/questions/22662900
复制相似问题