5

Linux コアダンプまたは Windows ミニダンプに相当する Java は何ですか? ヒープダンプについて読んだことがありますが、それは私が望むもののように見えますが、キャッチされていない例外でそれらを (自動的に) トリガーする方法は?

私はキャッチされていない例外ハンドラーについて知っており、すでにそれを使用して例外 + スタック トレースを出力し、アプリケーション全体を終了しています (そうしないと、スレッドが停止し、アプリケーションが実行し続けますか?) また、ヒープを記録する方法に関するこの投稿も見つけました。コードからダンプしますが、ハンドルされていない例外ハンドラーからそれを行うと、Java は既に例外をキャッチしており、スタック トレース (および引数) は失われています。

残念ながら-XX:+HeapDumpOnOutOfMemoryError、メモリ不足の例外のみであり、他のキャッチされていない例外ではありません。

これまでのところ、Google から抜け出すことができたのはこれだけです。現在、例外ブレークポイントを備えたアタッチされたデバッガーを使用していますが、処理された例外でも中断するため、非現実的であり、監視なしで使用することはできません。

【モチベーションアップ】

スタック トレースの引数とローカル変数を調べて、例外の原因を突き止めたいと考えています。通常はヌル参照の例外または失敗するアサーションであり、行番号から正確に何が問題なのかを常に推測できるとは限りません。C/C++ では、コアダンプ/ミニダンプを使用してクラッシュし、実際に何が原因でクラッシュしたかをさらに調べることに慣れています。

4

3 に答える 3

2

JNI を実行せずにネイティブ コードを呼び出している場合、JVM のメモリを破壊するのは非常に困難です。例外はヒープ ダンプやコア ダンプを必要としません。

Java の世界では、例外をスローするコードは、例外を読んで問題の原因を特定できる十分な情報を提供することが期待されています。場合によってはこれが発生せず、これに対処する正しい方法は、例外をスローするコードを変更して、例外に詳細情報を提供するか、何かをログ ファイルに記録することです。

例外をスローするコードが制御下になく、ソース コードにアクセスできない場合は、AspectJ を使用して、メソッドが例外をスローするようにアドバイスを織り込み、関数の引数を調べることができます。それらをアスペクトしてログに記録します。しかし、aspectJ / バイト コード ウィービングをルーティングする前に、理解しようとしているコードが log4j を使用しているか、またはデバッグ ロギング レベルを持つ他のロギング フレームワークを使用しているかどうかを確認する必要があります。

Google Guava Open Source Library を参照してください。引数を検証し、問題の原因についてより多くのコンテキストを取得するために使用できる Pre conidtions に関する優れたセクションがあります。http://code.google.com/p/guava-libraries/wiki/PreconditionsExplained

http://www.slf4j.org/も参照してください。これには、実行中の問題に関する情報をログに記録するために使用できる優れたログ API があります。

Eclipse で条件付きブレーク ポイントを実行することもできます。これにより、特定の状況下でのみブレークポイントを実行することができます。http://wiki.eclipse.org/FAQ_How_do_I_set_a_conditional_breakpoint%3F

使用するもう 1 つのツールは jvisiual vm です。これを使用すると、ライブ vm に接続し、すべてのスレッドがどこにあるのか、デッドロッカーがある場合は GC が何をしているかなど、vm 内で何が起こっているかについて多くの情報を見つけることができます。それを使用してヒープダ​​ンプをトリガーし、クエリを実行して、ヒープダンプ内の特定のオブジェクトの状態を確認できます。http://docs.oracle.com/javase/7/docs/technotes/guides/visualvm/index.html

于 2012-12-17T05:32:57.730 に答える
0

ヒープダンプはあなたが探しているものではないと思います。これはヒープの単なるダンプであり、そのスイッチをオンにする理由は、OOM例外が発生した場合に、リーク(またはその他)を見つけるためにメモリが何に使用されたかを調査する必要があるためです。問題)。

それはまさにあなたがそれらを使用したいのですか?たぶん、Javaであなたのニーズに対処するための代替の、しかしより良い方法があります。Javaのコアやミニダンプのようなものは必要なかったと思います。コードがどのように実行されたかを調べるためだけにabort()を呼び出す方法があればいいのにと思う状況を除いて。

于 2012-12-16T22:23:18.047 に答える
0

Oracle のこのブログでは、プログラムでヒープ ダンプを行う方法について説明しています。

https://blogs.oracle.com/sundararajan/entry/programmatically_dumping_heap_from_java

基本的に、ホットスポットcom.sun.management.HotSpotDiagnosticMXBeanとそのdumpHeap()方法を使用します。おそらく Oracle/Sun JVM でのみ動作し、遠い将来に動作するという保証はありません。

ただし、難しいのは、このヒープ ダンプを取得した後、そこから有用な情報を取得する方法です。新しくスローされた例外オブジェクトを見つけることから始めて、そこから行くと思います。プリミティブと参照がヒープダンプに存在しないため、メソッド引数とローカル変数値でヒープダンプが役に立たないもの。

于 2012-12-17T05:49:08.547 に答える