Java JADE代理使用堆空间过快

Java JADE代理使用堆空间过快,java,netbeans,out-of-memory,heap-memory,agents-jade,Java,Netbeans,Out Of Memory,Heap Memory,Agents Jade,我面临的问题是,当运行一组jade代理来解决一个简单的问题时,jvm会在90秒内耗尽堆空间,具体取决于运行的代理数量。代理的目标是在一个简化的微电网模型中平衡负载和发电,其中几个代理代表负载和另一代 load Agent在其行为的每次迭代中使用新值更新生成器,如以下代码所示: public class House9 extends Agent { double load = 50; boolean offline = false; boole

我面临的问题是,当运行一组jade代理来解决一个简单的问题时,jvm会在90秒内耗尽堆空间,具体取决于运行的代理数量。代理的目标是在一个简化的微电网模型中平衡负载和发电,其中几个代理代表负载和另一代

load Agent在其行为的每次迭代中使用新值更新生成器,如以下代码所示:

    public class House9 extends Agent
    {
      double load  = 50;
      boolean offline = false;
      boolean valid = true;
      int counter = 0;
      double cur = 50;
      int next;

      public void setup()
      {

          addBehaviour(new SimpleBehaviour(this)
          {
             public void action()
             {
                //Adjusting load value
                if(counter == 0)
                {
                  load = (int)load;
                  cur = load;
                  next = 20+(int)(Math.random()*80);
                  //System.out.println("current: " + cur + " next " + next);
                  counter++;
                }
                else if(counter <= 1000)
                {
                  load = load + ((next - cur)/1000);
                  //System.out.println("added " + ((next - cur)/1000) +" to load");
                  counter++;
                }               
                else
                {
                  counter = 0;
                }

                //System.out.println("counter " + counter);

                //Sending result to the generator agent
                ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
                msg.setContent(Double.toString(load));
                msg.addReceiver(new AID("gen", AID.ISLOCALNAME));
                myAgent.send(msg);

           }
           public boolean done()
           {
              return offline;
           }
      });
}
公共类House9扩展代理
{
双负载=50;
布尔离线=假;
布尔有效=真;
int计数器=0;
双电流=50;
int-next;
公共作废设置()
{
AddBehavior(新的SimpleBehaviour(本)
{
公共无效行动()
{
//调整负荷值
如果(计数器==0)
{
载荷=(int)载荷;
cur=负载;
next=20+(int)(Math.random()*80);
//系统输出打印项次(“当前:+cur+“下一步”+next);
计数器++;
}
else if(计数器输出)
{
iter=0;
while(加载>输出)
{
输出=输出+10;
iter++;
}
//System.out.println((System.currentTimeMillis()-time)+“,”+iter);
}
else if(负载<输出)
{
iter=0;
while(负载<输出)
{
输出=输出-10;
国际热核聚变实验堆;
}
//System.out.println((System.currentTimeMillis()-time)+“,”+iter);
}
System.out.println((System.currentTimeMillis()-time)+“,“+iter+”,“+load+”,“+temp+”,“+myAgent.getCurQueueSize());
}
}
});
}
}
从互联网上关于这类事情的其他帖子中,我尝试过限制生成代理的消息队列大小,以防它占用堆空间,同时在每个生成器行为迭代结束时清除jade消息队列。但这些似乎都没有任何区别,我尝试添加更多堆空间,但这只会将内存不足异常延迟一分钟左右。调用jade引擎,并通过netbeans启动jade gui

我对多代理编程和使用jade是个新手,因此我知道可能有更好、更优化的方法来运行这种系统,这本身就可以解释问题。但我希望能在这件事上得到一些帮助

谢谢,
Calum

房间内的行为9代理没有任何终止条件。每次安排行为时,每个代理都会发送一条消息。由于您已经重写了
done
方法,因此它们将继续循环发送消息


你的意思是要发这么多信息吗?消息之间应该有某种停顿吗?您的
生成器
代理将尝试处理所有这些消息,但无法跟上队列中的负载。

在NetBeans之外运行时是否存在此问题?我不确定我是否理解添加netbeans标记的原因。
    public class Generator extends Agent
    {
       int output = 100; 
       long time = System.currentTimeMillis();
       int iter = 0;


       public void setup()
       {
           System.out.println("Iterations,Time");

           addBehaviour(new CyclicBehaviour(this)
           {

               public void action()
               {
                   //myAgent.setQueueSize(2);
                     int temp = output;
                     ACLMessage reply = receive();

                     if(reply != null)
                     {
                        int load = Integer.parseInt(reply.getContent());
                        //System.out.println("current state--- output: " + output + " load: " + load);
                        if(load > output)
                        {
                           iter = 0;
                           while(load > output)
                           {
                               output = output + 10;
                               iter++;
                           }
                           //System.out.println((System.currentTimeMillis()-time)+ "," + iter );
                        }
                        else if(load < output)
                        {
                            iter = 0;
                            while(load < output)
                            {
                                output = output - 10;
                                iter--;
                            }
                            //System.out.println((System.currentTimeMillis()-time)+ "," + iter );

                        }

                        System.out.println((System.currentTimeMillis()-time)+ "," + iter + "," + load + "," + temp + "," + myAgent.getCurQueueSize());

                  }
              }
         });
      }
 }