1

私のシステムはメモリ リークに悩まされています。できるだけ早くメモリを解放して最適化しようとしています。

  1. これはファイナライズメソッドの良い使い方ですか?
  2. 「Throwable」オブジェクトはどこでキャッチできますか?

    public class OrderSendBulkHandler extends PandaSoapHandler {
    
    // <login,Data>
    private HashMap<String,OrderSendBulkData> followersData = new HashMap<String,OrderSendBulkData>();
    
    // <login,error_code> 
    private HashMap<String,BulkDataResponse> positionResponses = new HashMap<String,BulkDataResponse>();
    
    private Position position;
    
    private Float guruBalance;
    
    private float partialRatio = -1;
    
    private boolean ignorePosition = false;
    
    @Override
    protected void finalize() throws Throwable {
    try {
        followersData.clear();
        followersData = null;
        positionResponses.clear();
        positionResponses = null;
        position = null;
        guruBalance = null;
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    
    super.finalize();
    

    }

    // more code of the class here ...
    // .....
    

    }

4

5 に答える 5

2

finalize() メソッドを使用すると、実際にはメモリの解放が遅くなります。ファイナライズを使用する場合、オブジェクトをキューに追加する必要があるため、別のスレッドで呼び出されるまでクリーンアップされません。つまり、実際のクリーンアップが少なくとも 1 GC サイクル遅れます。

finalize() を使用しない場合は、1 サイクルでクリーンアップできます。これには、オブジェクトが参照するものも含まれます。

メモリ消費を削減する最善の方法は、メモリ プロファイラーを使用することです。オブジェクトが割り当てられている場所を調べるヒープ esp の内訳を見て、ガベージを減らし、保持されるメモリの量を減らすことで、GC の負荷を減らすことを検討します。

商用プロファイラーをお持ちでない場合は、Java 7 update 40 でサポートされている Java Mission Control を取得することをお勧めします。

于 2013-09-16T06:51:06.340 に答える
1
  1. いいえ、そうではありません。JVM は、オブジェクト グラフを走査し、未使用のオブジェクトを削除するのが得意です。独自の finalize メソッドを実装すると、パフォーマンスが低下するだけです。
  2. あなたはする必要はありません

メモリ リークを追跡するには、次の戦略を使用する必要があります。

  1. 次のプロパティをアプリケーションに追加します -XX:+HeapDumpOnOutOfMemoryError (HotSpot JVMを使用していると仮定)
  2. 何らかのテストでアプリケーションをロードして、最終的に OutOfMemoryError を取得します。その後、アプリ ディレクトリに .hprof ファイルを見つけることができます
  3. ダウンロードhttp://www.eclipse.org/mat/
  4. MAT ツールで .hprof ファイルを開き、ドミネーター ツリーを開き、問題の根本原因を見つけようとします。
于 2013-09-16T06:52:28.050 に答える
0

いいえ。 finalize() メソッドは、デフォルトではまだ発生しない関連することをまったく行いません。

于 2013-09-16T06:48:17.850 に答える