Jade:java.lang.OutOfMemoryError:Java堆空间

时间:2013-04-01 01:03:22

标签: java jvm agents-jade

我一直在使用jade(Java Agent Development Framework)来创建基于网络的消息传递系统。

到目前为止,我注意到玉石没有问题,但是有一天,我收到了这条消息,

enter image description here

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删除的引用对象。

系统设置:

  1. 操作系统:Linux 64位。
  2. JVM版本:IcedTea,1.6.0.27,64位。
  3. JVM选项:-Xms1024m-Xmx2048m-XX:MaxPermSize=512M
  4. 提前谢谢。

3 个答案:

答案 0 :(得分:1)

  

如何删除此内容?

你似乎已经将此作为内存泄漏进行了调查,并得出结论认为泄漏是在Jade。

如果是这种情况,那么首先要做的是搜索Jade邮件列表和错误跟踪器,看看这是否是一个已知问题,以及是否有已知的修复或解决方法。

如果失败,你有三个选择:

  • 进一步调查并追踪内存泄漏的原因,并为其开发修复程序。如果修复是一般性的,请将其归还给Jade团队。

  • 报告Jade bug跟踪器上的错误,并希望最终导致修复...

  • 绷带。使用更大的堆运行应用程序,并在获得OOME时重新启动它。


另一种可能性是内存泄漏是由代码引起的,或者是代码引起的。例如,你说:

  

经过调查,我发现这是由于收集变量可能会堵塞占用JVM空间的对象而不会将其清除掉。 (你可以看到Exception是从jade角度提出的,而不是我的代码端)

这不是水密的证据,证明问题出在Jade代码中。这意味着当内存最终用完时你正在执行Jade方法。我建议你下载Jade源代码并进一步研究这个(假设的)内存泄漏。准确找出真正导致它的原因,而不是根据假设和错误的推论进行诊断。

请记住,Jade是一款稳定的产品,很多人都在成功使用......没有内存泄漏问题。

答案 1 :(得分:1)

我可以推荐的最简单的事情之一是使用Plumbr。这恰恰意味着这种情况。如果Plumbr报告问题出在Jade代码中,那么您应该向他们提交错误报告。或者它可以帮助您在自己的应用程序中发现问题。

答案 2 :(得分:0)

问题在于另一个引擎正在缓冲对象以进行处理。 JADE不是罪魁祸首。我正在使用一个常见的ESPER引擎,并根据要解析的数据为事件处理创建新对象。

我正在调查如何定期清除这些内容而不会导致应用程序崩溃。

对不起,对不起!