2009-07-30 7 views
0

は、のは、クラスAとクラスBを呼びましょうJavaの静的ハッシュマップのメモリの問題は、私は2つのクラスを持っている

public class A{ 
private static HashMap<String,B> isc= new HashMap<String,B>(); 

public static void UserDisconnected(String key){ 
    if(isc.containsKey(key)){ 
     if(isc.get(publicSID).timer != null){ 
      isc.get(key).timer.cancel(); 
      isc.get(key).timer=null; 
     } 
     isc.remove(key); 
    } 
    log.debug("isc size:" + isc.size()); 
} 

//and other non-static variables and methods 

} 

public class B{ 
//contain no static variables and methods 
public void startStream(){ 
    timer = new Timer(); 
    timer.schedule(new timedTask(), 0, interval); 
} 

public class timedTask extends TimerTask{ 
    public void run(){ 
     //do something 
    } 
} 
クラスAは、アプリケーションのライフタイム全体を通じて生きる

しばらく参照されたクラスBのインスタンス 問題は、クラスAでUserDisconnected()メソッドを実行した後、iscのサイズが0であることがわかりますが、Windowsサーバーのタスクマネージャに表示されるメモリ使用量です2008年は元に戻って、メモリが解放されているのを見ないでください。 ハッシュマップガベージ内のクラスBのインスタンスが収集されたのでしょうか?ガベージコレクタが収集できない場所でもそれらが失われているかどうかを確認します。

ありがとうございました。

答えて

2

タスクマネージャのメモリ使用量が低下するとは思えません。使用されたメモリは、将来の使用のためにJavaに戻され、他のアプリケーション用のOSには戻されません。

+0

これはVM上である程度依存すると思います。頭の中の小さな声は、Hotspot Client VMがメモリをOSに戻す可能性が高いと言いますが、Server VMはメモリを保持しています。 – skaffman

+0

メモリリークの原因となるコードには何も問題はありません。 OSをメモリに戻す方法はありますか? –

+0

オブジェクトへの参照がすべて解放されている場合、そのオブジェクトはガベージコレクションされます(必ずしも直ちに実行されるわけではありません)。私はあなたがプログラム的にOSにメモリを返すことはできないと思います。 –

2

Windowsタスクマネージャは、Java JVMヒープがオペレーティングシステムによって割り当てられたメモリを表示しています。 GCが実行されると、番号は上下しません。

メモリが不安でリファレンスが長すぎる場合は、WeakHashMapを試してください。

また、iscのタイプとしてインターフェイスマップを使用することをおすすめします。

0

Windowsタスクマネージャを使用して、プログラムが使用するメモリの量を正確に知ることはできません。なぜなら、JVMはオブジェクトを使用していなくてもメモリを保持しているからです。 JVMとそのGCアルゴリズムは、プログラムが実際に使用するより多くのメモリを予約する方が効果的です。実際のメモリ使用量を調べるには、VisualVMのようなツールが必要です(最新のJDKにも付属しています)。

0

他にも触れたように、JVMは一般に、GCによって解放されたメモリをOSに返しません。

JVM内の使用済みメモリーと空きメモリーの比率を確認するには、VisualVMを使用し、メモリー・プロファイリング(ヒープ・スナップショット機能を使用)を使用してメモリー・リークの原因を突き止めることもできます。

JVM になりますが、デフォルト設定では、使用したメモリよりもはるかに空きがある場合にのみ、これが非常に不本意です。この動作は-XX:MinHeapFreeRatio and -XX:MaxHeapFreeRatio optionsで調整できます。

は、アプリケーションのプロファイリング:

0

VisualVMをダウンロードして使用すると、グラフとグラフがとてもきれいです... とにかく、私はそれを使ってアプリケーションをプロファイルします。 ありがとうたくさんの人。

関連する問題