내 응용 프로그램은 하루에 수백 개의 새로운 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
약한 참조를 사용하면 바로 그 부분에 대해 하드 참조를 사용하여 차이를 크게 잡지 않을 것입니다. r에 대한 포인터가 여전히 존재하므로 다른 포인터를 null로 설정하거나 약한 참조에 배치하는 것이 의미가 없습니다. 이를 위해서는 WTK 메모리 모니터보다 훨씬 뛰어나고 Codename One과 함께 작동하는 Java SE 프로파일 러/메모리 모니터를 사용해야합니다. –