Javadump(更常见的名字:javacore) -- 6
主题
Javadump(更常见的名字:javacore) – 6
线程和堆栈跟踪 (THREADS)
对于应用程序员而言,Java™ 转储最有用的部分之一是 THREADS 节。 该节显示 Java 线程、本机线程和堆栈跟踪的列表。
Java 线程由操作系统的本机线程执行。每个线程用一组行来表示,例如:
3XMTHREADINFO "main" J9VMThread:0x000000000F010500, j9thread_t:0x000000000113AC30, java/lang/Thread:0x00000000E0030068, state:R, prio=5 |
第一行的属性为线程名称、JVM 线程结构和 Java 线程对象的地址、Java 线程状态和 Java 线程优先级。对于 Java 线程,第二行包括 Java 线程对象的线程标识和守护程序状态。
- 本机操作系统线程标识
- 本机操作系统线程优先级
- 本机操作系统调度策略
内部 VM 线程状态
内部 VM 线程标志
Java 线程优先级会根据平台映射至操作系统优先级值。较大的 Java 线程优先级值表明该线程具有较高的优先级。换言之,该线程会比较低优先级的线程更频繁地运行。
Java 线程状态和内部 VM 线程状态的值可以是:
- R - 可运行 - 条件满足时,该线程将运行。
- CW - 等待条件 - 该线程正在等待。例如,由于:
- 针对 I/O 已阻止了该线程
- 调用了 wait() 方法,以等待通知监视器
- 该线程通过 join() 调用正在与另一个线程同步
- S – 已暂挂 – 该线程已被另一个线程暂挂。
- Z – 僵死 – 该线程已被结束。
- P – 停放 – 该线程已因新的并发 API (java.util.concurrent) 而被停放。
- B – 已阻塞 – 该线程正在等待获取其他对象当前拥有的锁。
如果线程停止或被阻止,那么输出中会包含针对该线程的一个行,该行以 3XMTHREADBLOCK 开头,会列出该线程正在等待的资源,以及当前拥有该资源的线程(如果可能)。有关更多信息,请参阅 阻塞线程信息。
对于 Java 线程和附加的本机线程,输出包含以 3XMCPUTIME 开头的行,它显示自线程启动以来线程所使用的 CPU 时间(秒数)。 将报告线程使用的总 CPU 时间。还会报告用户代码和系统代码中使用的时间。如果复用线程池中的 Java 线程,那么不会重置该线程的 CPU 计数,该计数会继续累计。
对于 Java 线程,以 3XMHEAPALLOC 开头的行会显示 Java 对象的字节数,以及自上次垃圾回收周期以来该线程所分配的数组。在该示例中,该行刚好在 Java 调用堆栈之前。
如果 Java 转储由异常 throw、catch、uncaught 或 systhrow 事件或者由 com.ibm.jvm.Dump API 触发,那么输出包含为线程存储的跟踪点历史记录。 有关更多信息,请参阅当前线程的跟踪历史记录。
启动 Java 转储以获取诊断信息时,JVM 会在生成 javacore 之前禁止操作 Java 线程。TITLE 部分的 1TIPREPSTATE 行会显示 exclusive_vm_access 的准备状态。
1TIPREPSTATE Prep State: 0x4 (exclusive_vm_access) |
在触发 javacore 时运行 Java 代码的线程具有 Java 线程状态 R(可运行)和内部 VM 线程状态 CW(条件等待)。
先前行为
在服务更新 8 之前,在触发 javacore 时运行 Java 代码的线程将线程状态显示为 CW(条件等待)状态,例如:
3XMTHREADINFO "main" J9VMThread:0x000000000F010500, j9thread_t:0x00000000026B6BF0, java/lang/Thread:0x00000000E00302F8, state:CW, prio=5 |
javacore
LOCKS
部分显示这些线程正在等待内部 JVM 锁定。
2LKREGMON Thread lock (0x00000000011A8CF8): <unowned> flags mutex |