2

URL のリストを調べて、それらのホームページの内容を分析しようとしています。これを行うには、URL を取得してパーサー クラスに送信して解析するレデューサーのない Hadoop マッパーを使用します。

パーサーは、Jericho の html パーサーのストリーミング ソース クラスを使用して、ページのコンテンツを読み取ります。実際には、バッファリングされたリーダーを使用して、上記のページのコンテンツを取り込みます。ストリーミングされたソースとバッファリングされたリーダー クラスの両方の close メソッドを呼び出すようにしました。その後、マッパーはパーサーの toString メソッドを呼び出し、次の URL に進みます。

メモリを簡単に分析したところ、ガベージ コレクタが追いつかないファイナライズ オブジェクトのヒープがあることがわかりました。の信頼性について悪いことを聞いたSystem.gc()ので、ファイナライズ オブジェクトのこの巨大なヒープを取り除くための別のよりクリーンな方法があるかどうか疑問に思っています。

4

1 に答える 1

1

最善の解決策は、コードからファイナライザーを削除することです。JVM は、ファイナライズ コードがいつ呼び出されるかを保証しません。あなたが経験している他の問題は、ファイナライザー スレッドがアプリの割り当て率に追いつかない可能性があることです。

ファイナライザーを使用しているオブジェクトのライフ サイクルを分析し、ファイナライズ コードを呼び出すことができるポイントを特定し、ファイナライザーが定義されないようにコードを変更し、すべてのクローズ/ファイナライズ シーケンスを手動で呼び出します。

于 2013-07-01T22:16:13.807 に答える