7

デフォルトでは、Hotspot を使用すると、CTRL-Break スレッド ダンプはjava.lang.concurrentロックを保持しているスレッドを一覧表示しません。また、これらのロックでは、ロックが取得されたスタック フレームに関する情報を Hotspot が取得できないことを理解しています。JVM オプションを追加すると-XX:+PrintConcurrentLocks、CTRL-Break スタック ダンプが (スレッドのスタック トレースの後に) そのフレームによって保持されている同時ロックを一覧表示します。例えば:

"D-Java-5-Lock" prio=6 tid=0x00000000069a1800 nid=0x196c runnable [0x000000000770f000]
   java.lang.Thread.State: RUNNABLE
      at com.Tester.longDelay(Tester.java:41)
      at com.Tester$D.run(Tester.java:88)

   Locked ownable synchronizers:
      - <0x00000007d6030898> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)

このオプションがないと、事後分析でこのロックを保持しているスレッドを特定することはできません。このオプションがデフォルトでないのはなぜですか? 明白でないパフォーマンスまたは安定性のペナルティはありますか? これについての議論を探すために検索しても、何も出てきません。

4

3 に答える 3

3

私はOracleに尋ねました(私の雇用主はサポート連絡先を持っています).答えは基本的に、オプションは安全に使用でき、多くの純粋な診断機能はデフォルトで無効になっており、これはそれらのオプションの1つです. IMO、診断機能が安全で安定しており、パフォーマンスが低下しない場合は、デフォルトでオンにする必要があります。これは、(当時の) Sun や (現在の) Oracle の見解ではないようです。

于 2011-09-01T18:40:19.557 に答える
2

私の推測では、それは不安定であるか、または JVM メンテナー (Sun-now-Oracle) がサポートされている機能として維持することを単に望んでいないということです。-XX:これは、プレフィックスで簡単にわかります。

-XX で指定されたオプションは安定しておらず、通常の使用にはお勧めできません。これらのオプションは予告なく変更される場合があります。

- Java HotSpot VM オプションから

また、そのページから、JDK 管理インターフェースを介してそのオプションを動的に有効または無効にすることができるため、必要に応じて MXBean を介して有効にすることができます。

管理可能とマークされたフラグは、JDK 管理インターフェース (com.sun.management.HotSpotDiagnosticMXBean API) および JConsole を介して動的に書き込み可能です。Java SE 6 プラットフォーム アプリケーションの監視と管理の図 3 に例を示します。管理可能なフラグは、jinfo -flag を使用して設定することもできます。

最後に、jstackスタック トレース ツールは、常に有効にしなくても、いつでも同じ機能を実行できます。

于 2011-08-16T05:04:13.380 に答える
2

ReentrantLocks だけが関連するスレッドを知っているためです。ランタイムでこの情報を取得するには、このメソッドを実現するためにヒープを調べて、すべてのロックとそのスレッドを見つける必要があります。

于 2017-09-07T22:57:44.513 に答える