java - 无法让 Mule 3.4.0 使用超过 4GB 的内存

标签 java memory-management mule java-service-wrapper

我目前正在开发一个需要大量内存的项目,但我无法让 Mule 3.4.0 使用超过 4GB 的 RAM(在 RHEL 6.2 上运行)。我使用的是 Java HotSpot 64 位服务器 JVM 1.7.0_45-b18 和 Mule 社区版本。

我一直在编辑wrapper.conf文件,并且尝试了很多设置但没有成功。

我发现 Mule JIRA 中列出了一个错误:https://www.mulesoft.org/jira/browse/MULE-7018 3.4.0 已关闭,但不完整。

我最近的尝试是明确尝试强制它立即占用 8GB 堆空间,以下是最新的尝试:

# Initial Java Heap Size (in MB)
wrapper.java.initmemory=8192

# Maximum Java Heap Size (in MB)
wrapper.java.maxmemory=8192

我尝试将 initmemorymaxmemory 参数设置为零,根据这篇关于包装器的旧文章:http://java-service-wrapper.996253.n3.nabble.com/4096MB-heap-limit-td1483.html - 但是,这会导致 mule 无法正常启动。

我还明确尝试通过包装器传递其他 JVM 参数:

wrapper.java.additional.6=-Xmx8192
wrapper.java.additional.7=-Xms8192

执行此操作时,我可以看到两个内存设置都被发送到 JVM(即,首先在进程行上发送 -Xmx8192 -Xms8192,然后发送 -Xms4096m -Xmx4096m) 。然而,我的 top 命令产生的 JVM 进程占用的驻留内存不超过 4.2GB。我意识到顶部 RES 列并不是确定 JVM 内存使用情况的 100% 确定方法,但我的印象是,如果我尝试分配开箱即用的 8GB,它肯定应该超过 4GB。机器有60GB物理内存。

有人找到了为 Mule 3.4.0 获取超过 4GB 堆空间的方法吗?

最佳答案

我相信 Anton 的答案会很好地工作,但是我无法清楚地弄清楚 Java Service Wrapper 的许可证何时更改为 GPL,并且不想冒该更改对我的用例产生任何负面影响的风险。

我找到了一种方法,可以使用 Mule 3.4.0 中包含的当前版本的 Java Service Wrapper 来完成这项工作,因此不会因 JSW 更改为 GPL 而产生任何额外的许可影响。

如果修改wrapper.conf以将最小和最大内存设置显式设置为0:

wrapper.java.initmemory=0
wrapper.java.maxmemory=0

然后您可以直接通过附加属性传递内存参数,也在wrapper.conf中:

wrapper.java.additional.6=-Xmx8192m
wrapper.java.additional.7=-Xms4096m

将 initmemory 和 maxmemory 显式设置为零后,包装器将不再首先将其自己的内存参数传递给 JVM,从而允许您指定自己的内存参数。请注意,这对于 maxPermGen 不起作用 - 由于某种原因,JSW 仍然为此指定自己的值。

关于java - 无法让 Mule 3.4.0 使用超过 4GB 的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21536413/

相关文章:

java -> 无法初始化类 com.android.repository.api.RepoManager

Mule 流变量与 session 变量性能

java - 根据编码计算字符字节长度的有效方法

Java理解

java - JBoss MBean 通知监听器问题

docker - Mule 3.7 JVM的内存不足

caching - Mule 4 - 使用 Redis 连接器作为自定义对象存储 "Connection is no longer valid"

php - PHP数组中的内存优化

c++ - malloc 未分配指定内存(64 位)

c - 在C中为结构中的数组分配顺序内存地址