私は瀕死のアプリケーションから作成したメモリダンプを持っています。使用可能なすべてのヒープ(-Xmx1024m)を消費しました。 com.gargoylesoftware.htmlunit.WebClient
を使用してWebページをクロールします。 1分あたりいくつかのHTTPリクエストを作成し、数日で終了します。ダンプから見ると、HtmlPage
クラスの〜1750インスタンスがあり、それぞれがクロールされたページの完全な内容を含む関連オブジェクトのトーンを持っています。ハンティングメモリリーク、VisualVM: "GCルートが見つかりません"。次は何ですか?
HtmlPage
がガベージコレクションされない理由を理解できません。私はインスタンス参照を調査しましたが、参照を保持しているコードは表示されません.VisualVMには「GCのルートが見つかりません」というメッセージが表示されます。私が理解しているように、オブジェクトがgcに適格であることを意味するはずですが、動作しません。
アプリケーションは単純なスタンドアロンプロセスとして実行されており、Webコンテナやアプリケーションサーバーは使用しません。
ヒント他に何を調べるべきですか?
仕様:
- htmlunitのV2.7
- Javaのバージョン "1.6.0_13" のJava(TM)SEランタイム環境(ビルド1.6.0_13-B03) は、Java HotSpot( TM)Server仮想マシン(Linuxはmy.lan
- 11.3-B02、混合モード)を構築2.6.18-128.el5#1 SMP水曜日12月17日11時42分39秒EST 2008 i686のi686のi386のGNU/Linuxの
アップデート1
私はYourKitのJavaプロファイラでダンプを分析することを試みました。それは私に多くのjava.lang.ref.Finalizer
オブジェクトが310メガバイト保持されていることを示しています。それらはnet.sourceforge.htmlunit.corejs.javascript.NativeGenerator#finalize()
ファイナライザ用に作成され、NativeGenerator
はWindow
を指し、HtmlPage
とすべてを指します。
誰もがなぜ彼らは記憶に残っているのか分かりませんか?
ノート:奇妙ですが、VisualVMは「保留中のファイナライズ」をゼロとして示していました。
JVMに特定のコマンドライン引数を使用しましたか? –
@ThomasJungblut '-Xmx1024m -XX:MaxPermSize = 128m -XX:+ PrintGCDetails -XX:+ PrintGCTimeStamps -XX:+ UseConcMarkSweepGC' – kan
また、htmlunit 2.8でメモリリークが発生しています。回避策として、WebClientを1日1回再インスタンス化します。このバグを追跡できることを願っています。 – milan