2

膨大な量のデータを完全にキャッシュするアプリケーションがあります。キャッシュは静的マップとして維持されます。

データはいくつかのバッチ サイクルで毎日変更されるため、データが変更された後にキャッシュを更新します。キャッシュの更新は、新しいオブジェクトを作成し、静的変数をこれらの新しいオブジェクトに参照することによって行われます。したがって、毎日新しいオブジェクトが作成され、古いオブジェクトは逆参照されます。

しかし、問題は、サーバー ヒープ メモリがメモリ例外なしでクラッシュするまで増加し続けることです。

逆参照されたオブジェクトがガベージコレクションされているかどうかは本当に疑問です。

これは私のクラスです。

Class CacheService {
 public static Map<String,Article> articleCache = null;

 public docache(){
     private Map<String,Article> tempArticleCache= new HashMap<String,Article>();

      //Caching stuff
       //finally
        articleCache = tempArticleCache; // i hope defreferencing takes place here.
 }

}

関数 docache() は、キャッシュを更新するために毎日呼び出されます。この問題なしでキャッシングを実現するのを手伝ってくれる人はいますか。

4

2 に答える 2

2

古い地図がまだどこかで参照されているのではないかと疑っています。以下を試すことをお勧めします(毎回新しいマップを作成するのではなく、既存のマップをクリアして再入力するだけです):

      public docache(){ 
           if(articleCache!= null){
                 //clear the elements of existing map
                 articleCache.clear();
           }else{
                 articleCache = new HashMap();
           }
           //do the map population
      }

これでもうまくいかない場合は、クラッシュする前にメモリ スナップショットを作成し、正確にどのオブジェクトがヒープを消費しているかを確認してください。これにより、問題についてより良いアイデアが得られます。

于 2012-11-22T23:26:30.687 に答える
1

マップである java.util.WeakHashMap を使用してみてください。オブジェクトが他の場所で参照されなくなると、WeakHashMap のエントリは自動的に削除されます。

于 2014-11-19T17:40:22.770 に答える