は、のは、クラス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のインスタンスが収集されたのでしょうか?ガベージコレクタが収集できない場所でもそれらが失われているかどうかを確認します。
ありがとうございました。
これはVM上である程度依存すると思います。頭の中の小さな声は、Hotspot Client VMがメモリをOSに戻す可能性が高いと言いますが、Server VMはメモリを保持しています。 – skaffman
メモリリークの原因となるコードには何も問題はありません。 OSをメモリに戻す方法はありますか? –
オブジェクトへの参照がすべて解放されている場合、そのオブジェクトはガベージコレクションされます(必ずしも直ちに実行されるわけではありません)。私はあなたがプログラム的にOSにメモリを返すことはできないと思います。 –