我目前正在开发一个需要大量内存的项目,但我无法让 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
我尝试将 initmemory
和 maxmemory
参数设置为零,根据这篇关于包装器的旧文章: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/