2011-10-24 14 views
2

Websphereで動作するJavaプログラムがあり、ストレートjdbc(HibernateまたはJPAなし)を使用するOracleデータベースが使用されています。私たちの顧客は、HP Performance Centerのを使用して負荷テストをやっている、と彼は負荷Oracle例外でjvmスレッド・ダンプをトリガーする方法はありますか?

Caused by: java.sql.SQLException: ORA-00060: deadlock detected while waiting for resource 

の下に時折Oracleの「デッドロック」の例外を取得しています、コード内または外部のいずれか、あなたをダンプしたスレッドと同じ種類のを強制する方法はありますこの例外が発生したときにkill -3 jvmを取得しますか?

答えて

7

例外が発生したときに自動的に検出できない場合、スレッドを列挙する方法を知ることはあまり役に立ちません。

私たちはこれを常にしています。私たちは、基本的に使用している:

Thread.setDefaultUncaughtExceptionHandler 

を我々のアプリが起動してから、我々は例外が発生したときに私たちが望むに関する情報をダンプする場合:へ

  • Map<Thread, StackTraceElement[]> mst = Thread.getAllStackTraces();

  • Runtime.getRuntime().freeMemory()/maxMemory()/totalMemory()基本的なメモリ情報を取得する

  • ユーザ利用パターンユーザの場合はユーザあなたは、他の多くのものを呼び出し、空想取得することができます

など

  • 家メイドの「分析」

  • と対話することができます。たとえば、完全なスタックトレースを含むクラッシュレポートを、そのようなトレースを待っているサーバーに自動的に送信しています。

  • +1

    +1;私はちっぽけなものを発見したとき、小さな電球が起こったことを覚えています。 –

    +0

    'kill -3'は各スレッドのスタックトレースと同様に、各スレッドが獲得して待機しているロックに関する情報を持っています。 'Thread.getAllStackTraces()'にもそれがありますか? –

    +0

    @Paul Tomblin:そうは思わない。 * findDeadlockedThreads *メソッドを使用してデッドロックを検出しています(この呼び出しをサポートするJVM上)。 –

    1

    現在のスレッドでは、Thread.dumpStack()を使用できます。

    Thread.enumerate()を使用すると、実行中のすべてのスレッドとdumpStack()を取得することができます。また、Thread.getAllStackTraces()を使用して、それらをコンソールまたは必要な場所に出力できます。

    これらの例外が発生したときにこれを行うには、自分のコードでこれを行うことができない場合は、AOPを試したり、エージェント(Java 6+を使用している場合)を作成したり、 SQLExceptionのソースコードを取得し、そのコンストラクタにスタックをダンプするように変更し、再コンパイルして、このクラスをブートクラスパスに戻します。

    関連する問題