我有一个运行着大量RSS连接器的Mule实例,我有一个服务在同一个Mule上下文中运行,接收RSS提要更新/删除/添加。当带有Feed的内容发生更改时,该服务会通过触摸Mule配置文件来触发热部署。这很好。 Mule重新加载上下文并获取更改。
但是,每次我进行热部署时,类加载器几乎会重新加载所有类,几乎每次都会重复初始的PermGen内存占用。最终,我跑出了PermGen空间,而Mule崩溃了。我做得多大并不重要 - 每次热部署都需要更多空间。我在YourKit,FWIW中监控这个。
我找到了一些关于使服务器使用共享库的一般信息,而不是在每个上下文中加载新的。我假设发生的是每次热部署时,都会创建一个新的Mule上下文,并且Mule会将所有类重新加载到新的上下文中,而不是使用已经加载的类。
如何在不耗尽PermGen的情况下进行多次热部署?
谢谢!
答案 0 :(得分:1)
尝试添加" -XX:PermSize = 128M -XX:MaxPermSize = 256M"在您的运行配置 - >参数选项卡 - > VM参数
答案 1 :(得分:0)
根据直接使用Mule支持的同事的建议,似乎除了偶尔重启之外,使用热部署并不是一种好的或可靠的做法。他们不鼓励使用它;相反,建议他们重新启动整个Mule服务器。
这对我来说也不是一个好选择。然而,事实证明,每次我需要添加新流时创建新的Mule上下文都工作得很好。我只是创建上下文,添加我的新流,然后启动上下文。简单,快速,干净。
DefaultMuleContextFactory对我来说很好。如果您有特殊需求,可能需要使用ConfigurationBuilder。
示例:
MuleContext newMuleContext = new DefaultMuleContextFactory().createMuleContext();
MuleRegistry registry = newMuleContext.getRegistry();
Flow flow = createFlow();
registry.registerFlowConstruct(flow);
newMuleContext.start();
请注意,这是在Mule 3.4.0中,但我也在3.5.0中测试了我的原始问题并遇到了同样的问题。这个修复程序适用于两者。