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;
}
對於代碼的第一部分感到抱歉,這是發佈後留下的一個錯誤,但我只是想表明在使用後我不保留對ConnectionRequest的任何引用。並且在調用System.gc()之後,它仍然保留在內存中。我通過WTK 2.5.2內存監視器檢查過它。這是我使用問題的整個代碼是哪裏可以保持參考?我還使用GoogleRestService檢查了食譜書樣本,並意識到它仍然保留在內存中。 – AzizD 2012-08-10 05:36:03
使用一個很弱的參考,以後你有一個很好的參考將不會有很大的區別。指向r的指針仍然存在,因此將其他指針設置爲null或將它們放在弱引用中是沒有意義的。爲此,您需要使用遠遠優於WTK內存監視器並使用Codename One的Java SE Profiler /內存監視器。 – 2012-08-15 15:44:40