我一直在使用jade(Java Agent Development Framework)来创建基于网络的消息传递系统。
到目前为止,我注意到玉石没有问题,但是有一天,我收到了这条消息,
JVM堆空间错误!
经过调查,我发现这是由于收集变量可能会堵塞占用JVM空间的对象而不会将其清除掉。 (你可以看到Exception是从jade角度提出的,而不是我的代码端)
如何删除此内容?
我的代码包含一个简单的TickerBehaviour类,如下所示:
public class MyBehaviour extends TickerBehaviour {
@Override
public void onTick() {
// Runs every second.
ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
msg.setOntology(username);
msg.addReceiver(new AID(username, AID.ISLOCALNAME));
msg.setContent(<my intended message to that identifier>);
agent.send(msg);
}
}
我进一步检查了我的代码是否创建了不必要的引用对象(通过注释最终生成intended message
的代码作为一种方式)我将其删除以删除所有功能并运行jade代理,并且令人惊讶,我注意到jade任务本身就是在创造这个问题。
我使用visualVM
检查正在进行的堆空间检查以查找活动对象创建,以检查JVM堆空间中仍有多少引用的对象。
旧的解决方案也没有多大帮助。任何人都可以帮我解决这个问题吗?
我已经使用了jade Container启动时推荐的选项,但仍然存在未被GC删除的引用对象。
系统设置:
-Xms1024m
,-Xmx2048m
和-XX:MaxPermSize=512M
提前谢谢。
答案 0 :(得分:1)
如何删除此内容?
你似乎已经将此作为内存泄漏进行了调查,并得出结论认为泄漏是在Jade。
如果是这种情况,那么首先要做的是搜索Jade邮件列表和错误跟踪器,看看这是否是一个已知问题,以及是否有已知的修复或解决方法。
如果失败,你有三个选择:
进一步调查并追踪内存泄漏的原因,并为其开发修复程序。如果修复是一般性的,请将其归还给Jade团队。
报告Jade bug跟踪器上的错误,并希望最终导致修复...
绷带。使用更大的堆运行应用程序,并在获得OOME时重新启动它。
另一种可能性是内存泄漏是由代码引起的,或者是代码引起的。例如,你说:
经过调查,我发现这是由于收集变量可能会堵塞占用JVM空间的对象而不会将其清除掉。 (你可以看到Exception是从jade角度提出的,而不是我的代码端)
这不是水密的证据,证明问题出在Jade代码中。这意味着当内存最终用完时你正在执行Jade方法。我建议你下载Jade源代码并进一步研究这个(假设的)内存泄漏。准确找出真正导致它的原因,而不是根据假设和错误的推论进行诊断。
请记住,Jade是一款稳定的产品,很多人都在成功使用......没有内存泄漏问题。
答案 1 :(得分:1)
我可以推荐的最简单的事情之一是使用Plumbr。这恰恰意味着这种情况。如果Plumbr报告问题出在Jade代码中,那么您应该向他们提交错误报告。或者它可以帮助您在自己的应用程序中发现问题。
答案 2 :(得分:0)
问题在于另一个引擎正在缓冲对象以进行处理。 JADE不是罪魁祸首。我正在使用一个常见的ESPER引擎,并根据要解析的数据为事件处理创建新对象。
我正在调查如何定期清除这些内容而不会导致应用程序崩溃。
对不起,对不起!