3

我一直在使用玉(Java 代理开发框架)来创建基于网络的消息传递系统。

到目前为止,我注意到翡翠运行没有问题,但是在晴朗的一天,我收到了这条消息,

在此处输入图像描述

JVM 堆空间错误!

经过调查,我发现这是由于集合变量可能阻塞了占用 JVM 空间而没有将其刷新出来的对象。(你可以看到异常是从玉的角度提出的,而我的代码方面没有)

我怎样才能删除这个?

我的代码由一个简单的 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);
 }
}

我进一步检查了我的代码是否正在创建不必要的引用对象(通过注释最终生成 myintended message作为一种方式的代码)我将其归结为删除我的所有功能并运行翡翠代理,令人惊讶的是,我注意到翡翠任务本身是创建这个问题。

我过去常常visualVM检查正在进行的堆空间检查,以检查有多少被引用的对象仍然位于 JVM 堆空间中。

较旧的解决方案也没有多大帮助。谁能帮我解决这个问题?

我已经使用了在翡翠容器启动期间推荐的选项,但是仍然存在没有被 GC 删除的引用对象。

系统设置:

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

先感谢您。

4

3 回答 3

1

我怎样才能删除这个?

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

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

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

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

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

  • 创可贴。使用更大的堆运行您的应用程序,并在收到 OOME 时重新启动它。


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

经过调查,我发现这是由于集合变量可能阻塞了占用 JVM 空间而没有将其刷新出来的对象。(你可以看到异常是从玉的角度提出的,而我的代码方面没有)

这不是问题出在 Jade 代码中的无懈可击的证据。这意味着当内存最终耗尽时,您正在执行 Jade 方法。我建议您下载 Jade 源代码并进一步调查此(假定的)内存泄漏。找出真正导致它的原因,而不是根据假设和错误推论做出诊断。

请记住,Jade 是许多人成功使用的稳定产品……没有内存泄漏问题。

于 2013-04-01T03:16:25.767 回答
1

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

于 2013-04-01T11:22:08.513 回答
0

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

我正在研究如何在不使应用程序崩溃的情况下定期清除这些内容。

抱歉,添麻烦了!

于 2013-06-04T09:31:19.727 回答