Java线程转储,找不到阻塞其他线程的线程

标签 java multithreading performance thread-dump jstack

我们的应用程序滞后。

我使用 jstack 获取线程转储实用程序。

我做了数据准备并对其进行排序。这就是我所拥有的:

198    java.lang.Thread.State: BLOCKED (on object monitor)

198    - waiting to lock <0x0000000582e56bc8> (a java.lang.Class for com.sun.xml.bind.v2.runtime.reflect.opt.AccessorInjector)

198 个线程被阻止。

据我了解 waiting to lock <0x0000000582e56bc8> ,他们都在等待某个 ID 为 0x0000000582e56bc8 的线程。奇怪的是我找不到这个0x0000000582e56bc8在线程转储输出中,我找不到他们都在等待的内容。

或者这不是真的?这是什么 0x0000000582e56bc8

这是一个小小的转储和平:

"http-thread-pool-8080(790)" daemon prio=3 tid=0x00000001100fa000 nid=0x339a waiting for monitor entry [0xfffffffeec1f6000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at com.sun.xml.bind.v2.runtime.reflect.opt.AccessorInjector.prepare(AccessorInjector.java:82)
        - waiting to lock <0x0000000582e56bc8> (a java.lang.Class for com.sun.xml.bind.v2.runtime.reflect.opt.AccessorInjector)

所有 198 个其他线程转储都是相同的

更新1.@Holder评论后

"http-thread-pool-8080(642)" daemon prio=3 tid=0x0000000110a8c800 nid=0x32ec runnable [0xffffffff05af5000]
   java.lang.Thread.State: RUNNABLE
        at java.util.zip.Inflater.inflateBytes(Native Method)
        at java.util.zip.Inflater.inflate(Inflater.java:256)
        - locked <0x000000058f2af0c0> (a java.util.zip.ZStreamRef)
        at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:152)
        at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:122)
        at org.apache.felix.framework.util.WeakZipFileFactory$WeakZipFile$WeakZipInputStream.read(WeakZipFileFactory.java:669)
        at java.io.DataInputStream.readShort(DataInputStream.java:312)
        at com.sun.xml.bind.v2.bytecode.ClassTailor.tailor(ClassTailor.java:173)
        at com.sun.xml.bind.v2.runtime.reflect.opt.AccessorInjector.tailor(AccessorInjector.java:126)
        at com.sun.xml.bind.v2.runtime.reflect.opt.AccessorInjector.prepare(AccessorInjector.java:85)
        - locked <0x0000000582e56bc8> (a java.lang.Class for com.sun.xml.bind.v2.runtime.reflect.opt.AccessorInjector)
        at com.sun.xml.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.get(OptimizedAccessorFactory.java:176)

更新 2 感谢@Holder

据我了解waiting to lock <0x0000000582e56bc8> ,意味着线程正在等待 0x0000000582e56bc8 ,这是一个指针。接下来你应该找到- locked <0x0000000582e56bc8> 。你会发现线程锁定了一个对象。然后我查看了堆栈跟踪,最后找到了罪魁祸首。

如果您也遇到 com.sun.xml.bind.v2.runtime.reflect.opt.AccessorInjector 的问题,看this question .

最佳答案

总结如何阅读堆栈跟踪来查找问题,如问题评论中所做的那样:

如果您找到类似的条目

  at com.sun.xml.bind.v2.runtime.reflect.opt.AccessorInjector.prepare(AccessorInjector.java:82)
  - waiting to lock <0x0000000582e56bc8> (a java.lang.Class for com.sun.xml.bind.v2.runtime.reflect.opt.AccessorInjector)

在堆栈跟踪中,您知道线程正在尝试锁定由数字 0x0000000582e56bc8 表示的对象实例,并且大括号中的文本进一步告诉您该对象是 表示运行时类 AccessorInjector 的 Class 实例。

由于此类对象表示声明该方法的类,因此该方法可能是静态同步方法,但该方法也可能包含类似 synchronized( AccessorInjector.class).

因此,您必须找到一个其堆栈跟踪包含匹配的 -locked 条目的线程,以了解哪些线程会阻塞其他线程。

自从您找到匹配项后

  at com.sun.xml.bind.v2.runtime.reflect.opt.AccessorInjector.prepare(AccessorInjector.java:85)
  - locked <0x0000000582e56bc8> (a java.lang.Class for com.sun.xml.bind.v2.runtime.reflect.opt.AccessorInjector)

我们看到锁定对象的线程正在执行与等待线程相同的方法,因此如果该方法是synchronized或包含synchronized(AccessorInjector),那么一切都是合理的.class) block 。

这是 Java 内在锁的不变属性,即只有一个线程可以继续锁定对象,而任意数量的其他线程必须等待。

关于Java线程转储,找不到阻塞其他线程的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23491667/

相关文章:

java - 列出 jax-rs 服务 bean

java - Spring 中的自定义标签

c++ - std::atomic 在一个简单的 POD 类上

java - 使用 for 循环创建和命名多个并发线程

performance - 大数据分析 : scalability but quick development

php - 性能:条件测试与分配

java - 最终 transient 字段和序列化

java - TigerGraph DB 的 JDBC 驱动程序

c++ - 如何安全地终止线程? (使用指针)c++

Android HttpUrlConnection : Post Multipart