我一直在使用玉(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 删除的引用对象。
系统设置:
- 操作系统:Linux 64 位。
- JVM 版本:IcedTea,1.6.0.27,64 位。
- JVM 选项
-Xms1024m
:-Xmx2048m
和-XX:MaxPermSize=512M
先感谢您。