如何避免 Mule 应用程序中的内存泄漏?

Att*_*ila 3 memory-leaks mule anypoint-studio mule-esb

为了避免Mule 应用程序中的内存泄漏,是否必须考虑一些特殊的事情?

如何避免 Mule 应用程序中的内存泄漏?

例如; 我们真的必须删除流变量吗?哪些内容必须由 Mule 应用程序的开发人员显式完成,哪些内容由Mule 运行时JVM GC (自动)完成?

小智 5

确定内存泄漏嫌疑的一个好方法是在您开始看到主要 GC 后内存回收量下降后立即进行(所有节点的)堆转储。有多种工具可以帮助分析内存泄漏。

该主题中有一篇很棒的博客文章。本文总结了一些与内存泄漏相关的问题,例如以下发现:

发现池化内存管理器通常会占用 10% 的 JVM 堆并使用它而不释放。 修复:切换 Grizzly 内存管理器实现 HeapMemoryManager。请注意,HeapMemoryManager 是默认实现,出于性能考虑,Grizzly 推荐使用 HeapMemoryManager;尽管如此,Mule 将 PoolMemoryManager 实现视为默认实现。

Wrapper.conf 更改:

wrapper.java.additional.<XX>=-Dorg.glassfish.grizzly.DEFAULT_MEMORY_MANAGER=org.glassfish.grizzly.memory.HeapMemoryManager
Run Code Online (Sandbox Code Playgroud)

发现异步日志记录被广泛使用,并且观察到相关 Log4J 占用了大量 JVM 内存。256*1024 插槽的默认设置显然太高了。由于此 RingBuffer 不会增长或收缩,因此将每个槽分配为单独的对象 (RingBufferLogEvent)(每个槽保存一个日志事件)的高固定大小可能会占用大量内存。

修复在wrapper.conf或log4j2.xml中将Log4J RingBuffer大小减少到128

wrapper.java.additional.<XX>=-DAsyncLoggerConfig.RingBufferSize=128
Run Code Online (Sandbox Code Playgroud)

或者,在 log4j2.xml 中:

<AsyncLogger name="DebugLog" level="info" includeLocation="true" ringBufferSize="128">
Run Code Online (Sandbox Code Playgroud)

由于聚合器组件使用默认的 HazelCast 实现(分割聚合器模式)而导致内存泄漏。

发现:堆分析指出特定流程中使用的拆分器聚合器组件中使用的默认 HazelCast 对象存储实现占用了内存。看起来好像商店没有适当地过期。

修复:编写自定义对象存储实现(PartitionedInMemoryObjectStore 的子类)并显式定义条目的 TTL (TimeToLive)。

@Override 
public void expire(int entryTTL, int maxEntries, String partitionName) throws ObjectStoreException
{
    super.expire(entryTTL, maxEntries, partitionName);
    if (getPrivatePartitionSize(partitionName) == 0) {
disposePartition(partitionName);
    }
}
Run Code Online (Sandbox Code Playgroud)

参考: https: //dzone.com/articles/enduring-black-fridays-with-mulesoft-apis