0

5 分ごとに呼び出される @Scheduled メソッドがあります。

バッチは多くの計算を行います。完了するまでに約 2 ~ 15 分かかります (バッチが既に実行されている場合、バッチが実行されないようにするフラグがあります)。

多くのMaps を使用して、計算結果をキャッシュします。そのまま再開できました。累積結果を含む 1 つの主要なマップと、内部計算用のサブメソッドへの一部のマップ/リスト。

バッチの実行には約 3 ~ 6 ギガかかる可能性があります。分析するには大量のデータが必要です。

メソッド内で使用したマップ/リストは、コードがメソッドを終了したときに GC の対象になると思いますか?

メソッドを終了する前に、メソッドまたは呼び出しでWeakHashMaporを使用する必要がありますか?WeakReferenceMap.clear();

バッチの最後で GC がクリーンアップを行うのを待たずに、可能であればメモリ使用量を減らしたいと考えています。

バッチが完了すると、メモリは最大 500megs-1G に減少します。

4

2 に答える 2

0

メソッドでWeakMapforを使用する必要がありますか?WeakReference

弱い参照は、データへの他の参照を保持し、そのデータがガベージ コレクションされるのを防ぎたくない場合にのみ有効です。処理を続行するにはそのデータが必要なため、これはあなたが行っていることのようには見えません。

Map.clear();またはメソッドを存在させる前に呼び出しますか?

マップがメソッドに対してローカルである場合、呼び出しclear()によって意味のある方法で GC が高速化されることはありません。ただし、マップがメソッドの終了後も使用可能なオブジェクトのフィールドである場合、呼び出しclearは「長引くメモリ リーク」を回避するための重要な方法です。

メモリ フットプリントを削減するための秘訣は、不要になったデータのサブセットを特定し、早期に解放することです。常にすべてのデータが必要な場合、または次に必要になるデータを判断する方法がない場合、プログラムの一時的なフットプリントを減らすことはできません。

于 2016-02-07T01:43:56.573 に答える