コンフィギュレーション・プロパティの概要

wrapper.check.deadlock プロパティ

このプロパティは、他のプロパティとの組み合わせで、

デッドロックしたスレッドについて JVMをどのようにモニター(監視)するかを設定するために使われます。 これは、何とか回避策がある場合には、 難しいような潜在的な致命的な問題を検知して回避するのに、とても役に立ちます。

スレッドのデッドロック・チェックは、少なくともJavaバージョン1.5の利用していることが必要です。 JVMだけはチェックを無視します。

デッドロックのチェックの処理は、わりと高速ですが、 全てのスレッドを一時的にロックしてスナップショットをとりますので、 このプロパティはデフォルトで「FALSE」になっています。

設定例:(デッドロック・チェック:OFF)
wrapper.check.deadlock=FALSE

設定例:

プロパティの詳細について下記をご覧いただきますが、 次のシンプルな例では、デッドロックの場所をログ化するようにWrapperを設定してあり、 即座にJVMを再起動します。

設定例:
wrapper.check.deadlock=TRUE
wrapper.check.deadlock.interval=60
wrapper.check.deadlock.action=RESTART
wrapper.check.deadlock.output=FULL

デッドロックって?

複数のスレッドがリソースをロックしているときに、 全てのスレッドが無制限に待ち状態になる状態になり、 デッドロックが起きることがあります。

一番シンプルな例だと、スレッドAがオブジェクトAをロックしている状態で、 オブジェクトBのロックを試みるケースのときに、 その間、他のスレッドBがオブジェクトBをロックした状態で オブジェクトAをロックしようと待機しているケースです。 このケースでは、 スレッドAは、オブジェクトB待ちのため、 オブジェクトAを決して開放されることはありません。 同時に、スレッドBは、オブジェクトAが有効になるのを待っているため、 オブジェクトBを永久にロックしたままになるため、 両者とも決して前に進めるはずがありません。

wrapper.check.deadlock.interval

wrapper.check.deadlock.interval] プロパティでは、 Wrapperがアプリケーションのデッドロックを探す インターバル(一定間隔の周期)のコントロールを可能にします。 最短で1秒毎に1回のインターバルを設定できますが、 デフォルトでは「60」(1分あたり1回)です。 一般的に、状態が安定していると分かっているアプリケーションの場合には、 このデッドロック・チェックの頻度を大幅に下げることも良いでしょう。

設定例:(60秒毎)
wrapper.check.deadlock.interval=60

wrapper.check.deadlock.action

wrapper.check.deadlock.action] プロパティでは、 デッドロックを検知したとき、Wrapperはどうするか、 Wrapperの動作についてのコントロールを可能にします。 デフォルトの動作では、「RESTART」です。

設定例:(再起動する)
wrapper.check.deadlock.action=RESTART

可能な動作は次のとおり:

  • RESTART -

    カレントJVMを停止して、新しい「起動の試み(invocation)」の再起動します。

  • SHUTDOWN -

    JVMを停止して、同様にWrapperも停止します。

  • DUMP -

    スレッド・ダンプを呼び出します。 当然のことながら、デッドロックが永続しているため、 JVMが再起動するまでずっと、デッドロックしたステート(状態)が持続します、 つまり、スレッド・ダンプもまた各インターバル(一定間隔の周期)ごとに呼び出されます のでご注意ください。

  • DUMP_RESTART -

    スレッド・ダンプを呼び出し、 カレントJVMを停止して、新しい「起動の試み(invocation)」の再起動します。

  • DUMP_SHUTDOWN -

    スレッド・ダンプを呼び出し、 JVMを停止して、同様にWrapperも停止します。

  • NONE -

    これは便利です、 なぜなら、高い数値を持つトリガーなら、 いかなるトリガーもトリガーされることを避けることができるので。 because it will prevent any triggers with a higher number from being triggered.

wrapper.check.deadlock.output

wrapper.check.deadlock.output] プロパティでは、 デッドロックを検知したとき、Wrapperがログ化する情報をコントロールを可能にします。 デフォルト出力では、「FULL」です。

設定例:(完全なフルログ)
wrapper.check.deadlock.output=FULL

可能な出力レベルは次のとおり:

  • FULL -

    JVM内部でWrapperManagerクラスが、 デッドロックで呼び出されたスレッドの完全なスタック・トレース(一時記憶の軌跡)を含む レポートを出力します。

    「FULL(フル)」の出力例:
    INFO   | jvm 1    | WrapperManager Error: Found 2 deadlocked threads!
    INFO   | jvm 1    | WrapperManager Error: =============================
    INFO   | jvm 1    | WrapperManager Error: "Locker-2" tid=18
    INFO   | jvm 1    | WrapperManager Error:   java.lang.Thread.State: BLOCKED
    INFO   | jvm 1    | WrapperManager Error:     at org.tanukisoftware.wrapper.test.DeadLock.lockSecond(DeadLock.java:64)
    INFO   | jvm 1    | WrapperManager Error:       - waiting on <0x000000002fcac6db> (a java.lang.Object) owned by "Locker-1" tid=17
    INFO   | jvm 1    | WrapperManager Error:     at org.tanukisoftware.wrapper.test.DeadLock.lockFirst(DeadLock.java:83)
    INFO   | jvm 1    | WrapperManager Error:       - locked <0x0000000029c56c60> (a java.lang.Object)
    INFO   | jvm 1    | WrapperManager Error:     at org.tanukisoftware.wrapper.test.DeadLock.access$100(DeadLock.java:22)
    INFO   | jvm 1    | WrapperManager Error:     at org.tanukisoftware.wrapper.test.DeadLock$1.run(DeadLock.java:42)
    INFO   | jvm 1    | WrapperManager Error:
    INFO   | jvm 1    | WrapperManager Error: "Locker-1" tid=17
    INFO   | jvm 1    | WrapperManager Error:   java.lang.Thread.State: BLOCKED
    INFO   | jvm 1    | WrapperManager Error:     at org.tanukisoftware.wrapper.test.DeadLock.lockSecond(DeadLock.java:64)
    INFO   | jvm 1    | WrapperManager Error:       - waiting on <0x0000000029c56c60> (a java.lang.Object) owned by "Locker-2" tid=18
    INFO   | jvm 1    | WrapperManager Error:     at org.tanukisoftware.wrapper.test.DeadLock.lockFirst(DeadLock.java:83)
    INFO   | jvm 1    | WrapperManager Error:       - locked <0x000000002fcac6db> (a java.lang.Object)
    INFO   | jvm 1    | WrapperManager Error:     at org.tanukisoftware.wrapper.test.DeadLock.access$100(DeadLock.java:22)
    INFO   | jvm 1    | WrapperManager Error:     at org.tanukisoftware.wrapper.test.DeadLock$1.run(DeadLock.java:42)
    INFO   | jvm 1    | WrapperManager Error:
    INFO   | jvm 1    | WrapperManager Error: =============================
    STATUS | wrapper  | A Thread Deadlock was detected in the JVM.  Restarting JVM.
  • SIMPLE -

    JVM内部でWrapperManagerクラスが、 デッドロックで呼び出されたスレッドやオブジェクトの簡単な概要だけを含む レポートを出力します。 多くの場合、特によく知られた問題に関しては十分です。

    「SIMPLE(シンプル)」の出力例
    INFO   | jvm 1    | WrapperManager Error: Found 2 deadlocked threads!
    INFO   | jvm 1    | WrapperManager Error: =============================
    INFO   | jvm 1    | WrapperManager Error: "Locker-2" BLOCKED waiting on a java.lang.Object owned by "Locker-1"
    INFO   | jvm 1    | WrapperManager Error: "Locker-1" BLOCKED waiting on a java.lang.Object owned by "Locker-2"
    INFO   | jvm 1    | WrapperManager Error: =============================
    STATUS | wrapper  | A Thread Deadlock was detected in the JVM.  Restarting JVM.
  • NONE -

    JVM内部でWrapperManagerクラスが、 全ての出力を抑えます。 これはシステム製品の利用に向いています。 問題は把握しており、 たくさんのログ情報を望まない、あるいは、保持する必要がない、ケースに適しています。 その他の選択として、Wrapperプロセスは、 トリガーされたアクションが 発生した理由を提供するために、 常にシングル・エントリをログ化していきます。

    「NONE(なし)」の出力例
    STATUS | wrapper  | A Thread Deadlock was detected in the JVM.  Restarting JVM.