2012-08-08 47 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