0

私のアプリケーションは、1日に100の新しい接続リクエストを作成し、jsonの応答を解析します。しかし、各リクエストの後にメモリが解放されないことに気付きました。system.gc()を使用すると、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;
}
4

1 に答える 1

0

System.gc()を呼び出す必要はなく、最後の変数にnullを割り当てているため、上記のコードはコンパイルされません。

ConnectionRequestsは、それらへの参照を保持しない限り、シームレスに収集されます。これは、そのように単純です。J2MEのWTK2.5.2には、割り当てスタックを確認できるメモリモニターがあり、Codename Oneの場合は、NetBeansプロファイラーを使用してメモリ割り当てを監視し、リークを元の場所まで追跡できます。

于 2012-08-09T16:29:01.323 に答える