主题
Javadump(更常见的名字:javacore) – 5
出现死锁时 Javadump 的 LOCKS 组件部分的示例。
锁定通常用于防止一个以上的实体访问共享资源。Java™ 语言中的每个对象都有关联的锁定,也称为监控器,线程通常使用同步方法或代码块来获得锁定。就 JVM 而言,线程会竞争使用 JVM 中的各种资源和 Java 对象上的锁定。
在进行 Java 转储时,JVM 会尝试检测死锁循环。JVM 可以检测循环,这些循环是由通过同步获得的锁定、
用于扩展 java.util.concurrent.locks.AbstractOwnableSynchronizer 类的锁定
或两种锁定类型的组合组成的。
下面的示例来自死锁测试程序,其中的两个线程 DeadLockThread 0 和 DeadLockThread 1 尝试在 java/lang/String 对象上进行同步时失败,并且锁定了 java.util.concurrent.locks.ReentrantLock 类的实例。
示例中的 Locks 部分(已突出显示)显示出线程 DeadLockThread 1 锁定了对象实例 java/lang/String@0x00007F5E5E18E3D8。 监视器作为 Java 代码片段(例如 synchronize(aString))的结果而创建,并且此监视器让 DeadLockThread 0 等待获取同一对象实例 (aString) 上的锁定。死锁部分还显示了 java.util.concurrentlocks.ReentrantLock$NonfairSync 类的实例,该实例被 DeadLockThread 0 锁定,并让 DeadLockThread 1 等待。
这一典型的死锁情况由应用程序设计中的错误所致;Javadump 是这类事件检测中的一个主要工具。
在 Java 转储的 Threads 部分中,以 3XMTHREADBLOCK 开头的与被阻止、等待或停止的线程有关的行提供了与被阻止的线程有关的信息。有关更多信息,请参阅 阻塞线程信息。
NULL ------------------------------------------------------------------------ 0SECTION LOCKS subcomponent dump routine NULL =============================== NULL 1LKPOOLINFO Monitor pool info: 2LKPOOLTOTAL Current total number of monitors: 2 NULL 1LKMONPOOLDUMP Monitor Pool Dump (flat & inflated object-monitors): 2LKMONINUSE sys_mon_t:0x00007F5E24013F10 infl_mon_t: 0x00007F5E24013F88: 3LKMONOBJECT java/lang/String@0x00007F5E5E18E3D8: Flat locked by "Deadlock Thread 1" (0x00007F5E84362100), entry count 1 3LKWAITERQ Waiting to enter: 3LKWAITER "Deadlock Thread 0" (0x00007F5E8435BD00) NULL 1LKREGMONDUMP JVM System Monitor Dump (registered monitors): 2LKREGMON Thread global lock (0x00007F5E84004F58): <unowned> 2LKREGMON &(PPG_mem_mem32_subAllocHeapMem32.monitor) lock (0x00007F5E84005000): <unowned> 2LKREGMON NLS hash table lock (0x00007F5E840050A8): <unowned> < lines removed for brevity >
1LKDEADLOCK Deadlock detected !!! NULL --------------------- NULL 2LKDEADLOCKTHR Thread "Deadlock Thread 0" (0x00007F5E8435BD00) 3LKDEADLOCKWTR is waiting for: 4LKDEADLOCKMON sys_mon_t:0x00007F5E24013F10 infl_mon_t: 0x00007F5E24013F88: 4LKDEADLOCKOBJ java/lang/String@0x00007F5E5E18E3D8 3LKDEADLOCKOWN which is owned by: 2LKDEADLOCKTHR Thread "Deadlock Thread 1" (0x00007F5E84362100) 3LKDEADLOCKWTR which is waiting for: 4LKDEADLOCKOBJ java/util/concurrent/locks/ReentrantLock$NonfairSync@0x00007F5E7E1464F0 3LKDEADLOCKOWN which is owned by: 2LKDEADLOCKTHR Thread "Deadlock Thread 0" (0x00007F5E8435BD00)
|