1

実行しているHadoopプログラムで明らかにメモリリークが発生しています。具体的には、次のメッセージが表示されます。ERRORGCオーバーヘッド制限を超えた後、例外が発生しました

attempt_201210041336_0765_m_0000000_1: Exception in thread "Tread for syncLogs" java.lang.OutOfMemoryError: GC overhead limit exceeded
attempt_201210041336_0765_m_0000000_1: at java.util.Vector.elements (Vector.java:292)
attempt_201210041336_0765_m_0000000_1: at org.apache.log4j.helpers.AppenderAtachableImpl.getAllAppenders(AppenderAttachableImpl.java:84
attempt_201210041336_0765_m_0000000_1: at org.apache.log4j.Category.getAllAppenders (Category.java:415)
attempt_201210041336_0765_m_0000000_1: at org.apache.hadoop.mapred.TaskLog.syncLogs(TaskLog.java:256)
attempt_201210041336_0765_m_0000000_1: at org.apache.hadoop.mapred.Child$3.run(Child.java:157)

最初の試行では非常に小さなデータセットで実行しているので、メモリ制限に達することはありません。さらに言えば、Hadoop構成を変更したくありません。プログラムを現在の構成で実行できない場合は、プログラムを書き直す必要があります。

誰かがこの問題を診断する方法を理解するのを手伝ってもらえますか?メモリ使用量のスタックトレースを取得するためのコマンドライン引数はありますか?この問題を追跡する他の方法はありますか?

ps。エラーメッセージを手作業で作成しましたが、問題のあるシステムからコピーして貼り付けることができません。ですから、私の愚かな過ちであるとして、どんなタイプミスも無視してください。

編集:これに更新します。私はその仕事をさらに数回実行しました。エラーGCオーバーヘッド制限超過メッセージが常に表示されますが、log4jのスタックトレースが常に表示されるとは限りません。したがって、問題はおそらくlog4jではなく、代わりにlog4jが...他の何かによって引き起こされたメモリ不足のためにたまたま失敗しましたか?

4

1 に答える 1

0

「GCオーバーヘッド制限を超えました」は、おそらく、合計時間の98%以上を消費することなく、GCが処理できる以上の、短期間のオブジェクトが多数作成されていることを意味します。JProfilerを使用して問題のあるクラスと割り当てスポットを見つける方法については、この質問を参照してください。

免責事項:私の会社はJProfilerを開発しています。

于 2012-12-03T09:59:56.750 に答える