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