2012-08-08 60 views
0

我的应用程序每天创建100个新的Connection请求并解析json响应。但是我已经意识到它不会在每次请求后释放内存。尽管使用system.gc()它存储了ConnectionRequest实例和我的类的实例以解析json响应。我想最后它会导致系统内存不足错误。如何释放使用过的Connectionrequest的内存

这里是一些代码:

protected boolean onMainFormCommand54(){ 
     //LevakandRestService similar to GoogleRestService 
     final LevakandRestService r =new LevakandRestService(); 
     r.RequestUBalance(balance);   
     final Progress p = new Progress(Globals.Loading, r); 
     p.showPacked(BorderLayout.CENTER, false); 
     p.setDisposeOnCompletion(true); 
     r.addResponseListener(new ActionListener() { 
      public void actionPerformed(ActionEvent ae) {        
        p.dispose();          
        Dialog.show(Globals.Info, "Balance:" +balance.getBalance(),Globals.OK, ""); 
      } 
     }); 
     NetworkManager.getInstance().addToQueueAndWait(r); 

     System.gc(); 
     return val; 
    } 

我一直在使用WeakReference的尝试,但它并没有帮助。

protected boolean onMainFormCommand54() {//Balance of user 

    boolean val = super.onMainFormCommand54();  
    Balance balance1 = new Balance(); 
    WeakReference wrb = new WeakReference(balance1);  
    final Balance balance =(Balance)wrb.get(); 
     LevakandRestService r1 = new LevakandRestService();    
     WeakReference wr = new WeakReference(r1);    
     final LevakandRestService r =(LevakandRestService)wr.get(); 
     r.RequestUBalance(balance);   
     final Progress p = new Progress(Globals.Loading, r); 
     p.showPacked(BorderLayout.CENTER, false); 
     p.setDisposeOnCompletion(true); 
     r.addResponseListener(new ActionListener() { 
      public void actionPerformed(ActionEvent ae) {        
        p.dispose();          
        Dialog.show(Globals.Info, "Balance:" +balance.getBalance(),Globals.OK, ""); 
      } 
     }); 
     NetworkManager.getInstance().addToQueueAndWait(r); 
     r1=null;      
    balance1 = null;  
    System.gc(); 
    return val; 
} 

回答

0

您不需要调用System.gc(),并且上面的代码不会编译,因为您将null指定给最终变量。

ConnectionRequests会被无缝地收集,除非您保留对它们的引用,它就像那样简单。 J2ME的WTK 2.5.2有一个内存监视器,它允许您查看分配堆栈,而对于Codename One,您可以使用NetBeans Profiler监视内存分配并将漏洞追溯到它们始发的位置。

+0

对于代码的第一部分感到抱歉,这是发布后留下的一个错误,但我只是想表明在使用后我不保留对ConnectionRequest的任何引用。并且在调用System.gc()之后,它仍然保留在内存中。我通过WTK 2.5.2内存监视器检查过它。这是我使用问题的整个代码是哪里可以保持参考?我还使用GoogleRestService检查了食谱书样本,并意识到它仍然保留在内存中。 – AzizD 2012-08-10 05:36:03

+0

使用一个很弱的参考,以后你有一个很好的参考将不会有很大的区别。指向r的指针仍然存在,因此将其他指针设置为null或将它们放在弱引用中是没有意义的。为此,您需要使用远远优于WTK内存监视器并使用Codename One的Java SE Profiler /内存监视器。 – 2012-08-15 15:44:40