私はアプリケーションでクラスローダーのリークに取り組んでおり、最終的にCLへのすべての参照がなくなったということになりました。私のメモリプロファイリングツール(YourKitとjmap/jhatを使用)では、時々すぐにクラスローダーを取り除くGCを強制することができますが、それ以外の時間(アプリケーションの使用状況にもよりますが、 GC、CLインスタンスは消えません。私は、メモリスナップショットをキャプチャし、結果を見て、それはこのオブジェクトが存在するが、到達不能であると言います。到達不能なオブジェクトをGCするのにJVMを長く使うのはなぜですか?
ここは変わった部分です...私はこれを偶然発見しました。
私は完全にGCを強制することができますが、インスタンスは離れません。しかし、10〜20分後にもう一度完全なGCを実行すると、はになります。うまくいけば
(この間アプリケーションは)ない全く(ほとんどは非アクティブです。私の「拡張」のコーヒーブレークは、この発見につながった事故だった。)
だからここにリークについての私の懸念は消えました( )、しかし問題は今、この振る舞いを説明しようとしています。
Sun JVMが到達不能なクラスローダーを20分間収集しないことを知っている人は誰でも知っていますか?
日JVMのバージョンの詳細:クラスローダ(とクラス:
java version "1.6.0_23"
Java(TM) SE Runtime Environment (build 1.6.0_23-b05)
Java HotSpot(TM) 64-Bit Server VM (build 19.0-b09, mixed mode)
これが役に立つかもしれません。情報のhttp://java.sun.com/developer/technicalArticles/javase/finalization/ – Jeremy
つ以上のビットは、おそらく関連している:私はここで、並列コレクタを使用しています。 – Scott
私の経験はあなたのものと全く同じであり、私はいつも正しいGCが達成するために複雑な方法でしか説明できません。それに関する興味深い「ディスカッション」はここにあります:http://stackoverflow.com/questions/176745/circular-references-in-java。 は、ガベージコレクタ、一つであるクラスローダー、弱参照であるanothersで扱ういくつかの特別な場合があります。実際のGCソースコードや_proven_答えを読んでこれを証明しようとしたら、ここに投稿してください。詳細にJava5でGCを議論する別の記事:http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html –