3

セマフォでロックの競合があり、ロックが保持されている時間を測定したいと考えています。

そのようなことを測定するための無料のツールはありますか?

Visual VM を試してみたところ、ロックの競合が見られましたが、時間の方が気になります。

提案していただきありがとうございます。

これ50個くらい持ってる

"[ACTIVE] ExecuteThread: '226' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=3 tid=0x00000001099fa000 nid=0x41e waiting for monitor entry [0xfffffffe5a8f9000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:292)
    - waiting to lock <0xfffffffeb063ebb0> (a weblogic.utils.classloaders.GenericClassLoader)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:176)
    at com.thoughtworks.xstream.core.util.CompositeClassLoader.loadClass(CompositeClassLoader.java:69)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
    at com.thoughtworks.xstream.XStream.dynamicallyRegisterConverter(XStream.java:723)
    at com.thoughtworks.xstream.XStream.setupConverters(XStream.java:696)
    at com.thoughtworks.xstream.XStream.<init>(XStream.java:445)
    at com.thoughtworks.xstream.XStream.<init>(XStream.java:385)
    at com.thoughtworks.xstream.XStream.<init>(XStream.java:342)
4

2 に答える 2

5

Sun Studio Performance Analyzerを使用して、ロック プロファイリングを有効にすることができます。これにより、ロックに費やされた時間が表示されます。

jProfiler には Thread/Monitor 統計タブもあるので、試してみてください。

もう 1 つの方法は、特定の間隔でスレッド ダンプをサンプリングし、手動で計算して推定値を取得することです。

もう 1 つの方法は、セーフ ポイント統計( +XX:PrintSafePointStatistics) を出力することです。これにより、「スレッドがブロックされた時間 (ミリ秒単位)」も出力されます。詳細については、 JVM SafePointStatisticsを参照してください。

于 2013-06-04T22:33:47.553 に答える
3

super.acquire() を呼び出す前後に、セマフォを拡張し、取得をオーバーライドして必要な情報をログに記録できると思います。

于 2013-06-04T13:55:46.857 に答える