4

私は Java (J2SE) アプリケーションをデバッグする任務を負っています。このアプリケーションは、一定期間のアクティビティの後に OutOfMemory 例外をスローし始めます。Java は初めてですが、プログラミングの経験はあります。このような問題を診断するための適切なアプローチについて、ご意見をお聞かせください。

ここまでは、JConsole を使用して何が起こっているのかを把握してきました。オブジェクトが適切に解放されていないため、ガベージ コレクション中にクリーンアップされていないという予感があります。

オブジェクト エコシステムの全体像を把握するために使用できるツールはありますか? どこから始めますか?

4

5 に答える 5

4

Eclipse Memory Analyzer 、またはJavaヒープダンプを処理できるその他のツールを試してから、メモリが不足したときにヒープダンプを生成するフラップを使用してアプリを実行します。

次に、ヒープダンプを分析し、疑わしいほど高いオブジェクト数を探します。

ヒープダンプの詳細については、この記事を参照してください。

編集:また、アプリが最初に考えていたよりも多くのメモリを合法的に必要とする場合があることに注意してください。最初にJavaの最小メモリ割り当てと最大メモリ割り当てを大幅に大きくして、アプリケーションが無期限に実行されるのか、それとも少しだけ遠くなるのかを確認してみてください。

于 2009-01-06T21:55:01.127 に答える
4

適切な Java プロファイラーから始めます。JConsole は無料ですが、有料のものほどフル機能にはほど遠いものです。私は JProfiler を使用しましたが、お金を払うだけの価値がありました。その他のオプションと意見については、 https://stackoverflow.com/questions/14762/please-recommend-a-java-profilerを参照してください。

于 2009-01-06T21:49:00.190 に答える
2

Sun JDK の最新バージョンには、実質的にそれ自体が Netbeans プロファイラーである VisualVM が含まれています。それは本当にうまくいきます。

于 2009-01-07T00:56:17.610 に答える
1

http://www.yourkit.com/download/index.jspが必要な唯一のツールです。(1) アプリの開始時、および (2) アプリを N 時間実行した後にスナップショットを作成し、スナップショットを比較して、メモリが割り当てられる場所を確認できます。OutOfMemoryError のスナップショットも作成されるため、このスナップショットを (1) と比較できます。

たとえば、私がトラブルシューティングしなければならなかった最新のプロジェクトは OutOfMemoryError 例外をスローしました。YourKit を起動した後、ほとんどのメモリが実際には ehcache の「LFU」クラスに割り当てられていることに気付きました。ポイントは、特定の POJO のロードをメモリにキャッシュされていますが、十分な -Xms および -Xmx (開始および最大 JVM メモリ割り当て) を指定していません。

Linux のvmstatも使用しました。たとえば、一部の Linux プラットフォームでは十分なスワップが有効になっていないか、連続したメモリ ブロックが割り当てられていないため、jstat (JDK にバンドルされています) があります。

更新を参照してください https://stackoverflow.com/questions/14762/please-recommend-a-Java-profiler

于 2009-01-06T22:34:28.490 に答える
-1

アプリケーションのスレッドに「UnhandledExceptionHandler」を追加することもできます。これにより、メモリ不足エラーなどの「キャッチされなかった」例外がキャッチされ、少なくとも例外がスローされた場所がわかります。通常、これは問題ではありませんでしたが、満足できなかった「新しい」です。原則として、ロギングを追加するものが他にない場合は、常にUnhandledExceptionHandlerをスレッドに追加します。

于 2009-01-07T00:40:45.740 に答える