跳至主要內容
JVM - jvm线程状态
  • 执行jstack -l 查看当前线程的堆栈信息,可以看到线程的堆栈信息,当中有一个部分展示的是:
"nioEventLoopGroup-8-4" #694 prio=10 os_prio=0 cpu=13597.70ms elapsed=128507.28s tid=0x00007f88e4012000 nid=0x2c4 runnable  [0x00007f88bb3f4000]
   java.lang.Thread.State: RUNNABLE
	at sun.nio.ch.EPoll.wait(java.base@11.0.20/Native Method)
	at sun.nio.ch.EPollSelectorImpl.doSelect(java.base@11.0.20/EPollSelectorImpl.java:120)
	at sun.nio.ch.SelectorImpl.lockAndDoSelect(java.base@11.0.20/SelectorImpl.java:124)
	- locked <0x00000000818c5678> (a io.netty.channel.nio.SelectedSelectionKeySet)
	- locked <0x00000000818c5578> (a sun.nio.ch.EPollSelectorImpl)
	at sun.nio.ch.SelectorImpl.select(java.base@11.0.20/SelectorImpl.java:141)
	at io.netty.channel.nio.SelectedSelectionKeySetSelector.select(SelectedSelectionKeySetSelector.java:68)
	at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:879)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:526)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.lang.Thread.run(java.base@11.0.20/Thread.java:829)

   Locked ownable synchronizers:
	- None

HFwas...大约 4 分钟jvmjavajvmjstatjstack
JVM - 查看jvm堆栈使用
  • 执行jstat -gc 10
S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT    CGC    CGCT     GCT   
 0.0   83968.0  0.0   83968.0 1206272.0 922624.0  806912.0   127399.0  139264.0 134513.7 16640.0 14836.9     60    9.120   0      0.000   0      0.000    9.120

HFwas...小于 1 分钟jvmjavajvmjstatjstack
JVM - JVM相关的命令

jps

  • 可以显示当前全部java进程pid,可以用来迅速查看当前容器当中运行的java进程

jstack

  • jstack是JVM自带的Java堆栈跟踪工具,它用于打印出给定的java进程ID、core file、远程调试服务的Java堆栈信息
  • jstack命令用于生成虚拟机当前时刻的线程快照。
  • 线程快照是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因, 如线程间死锁、死循环、请求外部资源导致的长时间等待等问题。
  • 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。
  • 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。
  • 另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的

HFwas...大约 2 分钟jvmjavajvmjstatjstack
JVM - jstack命令

常见用法

  • 主要是-l 参数,其他不常用
image-20240525170124121

示例

  • 执行命令jstack -l 10
# jstack -l 10 
2024-05-24 23:24:33
Full thread dump OpenJDK 64-Bit Server VM (11.0.20+8 mixed mode):

Threads class SMR info:
_java_thread_list=0x00007f88880018f0, length=92, elements={
0x00007f8a387bb000, 0x00007f8a387bf000, 0x00007f8a387d4800, 0x00007f8a387d6800,
0x00007f8a387d8800, 0x00007f8a387da800, 0x00007f8a387dc800, 0x00007f8a38893800,
0x00007f8a3b295000, 0x00007f8a3b2a2000, 0x00007f8a3b267800, 0x00007f8a3b4aa800,
0x00007f8a38e1d000, 0x00007f8a397c4000, 0x00007f8a397c5000, 0x00007f8a3b6f5800,
0x00007f8a3b6db800, 0x00007f8a3adaf800, 0x00007f8a39328000, 0x00007f89b00a5800,
0x00007f89b0077800, 0x00007f89b00b4000, 0x00007f89a406e000, 0x00007f89a8011800,
0x00007f899c0af000, 0x00007f89a407b000, 0x00007f898c00c800, 0x00007f899400c000,
0x00007f8990005000, 0x00007f8984001800, 0x00007f8988001800, 0x00007f897c001800,
0x00007f8974001800, 0x00007f8980001800, 0x00007f8978001800, 0x00007f896c001800,
0x00007f8970001800, 0x00007f8968001800, 0x00007f8964001800, 0x00007f8960001800,
0x00007f895c001800, 0x00007f8958001800, 0x00007f8954001800, 0x00007f8950001800,
0x00007f894c001800, 0x00007f8948001800, 0x00007f893c001800, 0x00007f8934001800,
0x00007f8944001800, 0x00007f89ac001800, 0x00007f8a3b383800, 0x00007f8a39660800,
0x00007f8a3b7c3000, 0x00007f8a3b8f6000, 0x00007f8a3b8fc000, 0x00007f8a3b900000,
0x00007f8a3b910000, 0x00007f8a3b925800, 0x00007f8a3b927800, 0x00007f8a3b929000,
0x00007f8a3b92b000, 0x00007f8a3b92d000, 0x00007f8a3b92f000, 0x00007f8a3b931000,
0x00007f8a3b933800, 0x00007f8910031000, 0x00007f8a3b935800, 0x00007f8a3b937800,
0x00007f8a3b93e000, 0x00007f8a3b94a000, 0x00007f891003c800, 0x00007f88e400f800,
0x00007f88cc0ba800, 0x00007f88d000a800, 0x00007f8a3a301800, 0x00007f8a3802c800,
0x00007f88c0023000, 0x00007f88c0002800, 0x00007f88c0003000, 0x00007f88c0025000,
0x00007f88c0026000, 0x00007f88c0027800, 0x00007f88c002e000, 0x00007f88c0030000,
0x00007f88c0032000, 0x00007f88e4002000, 0x00007f88e4011000, 0x00007f88e4012000,
0x00007f88a844e000, 0x00007f89f8004800, 0x00007f88a84c3000, 0x00007f8918007800
}

"Reference Handler" #2 daemon prio=10 os_prio=0 cpu=43.73ms elapsed=65039.30s tid=0x00007f8a387bb000 nid=0x12 waiting on condition  [0x00007f8a3c223000]
   java.lang.Thread.State: RUNNABLE
	at java.lang.ref.Reference.waitForReferencePendingList(java.base@11.0.20/Native Method)
	at java.lang.ref.Reference.processPendingReferences(java.base@11.0.20/Reference.java:241)
	at java.lang.ref.Reference$ReferenceHandler.run(java.base@11.0.20/Reference.java:213)

   Locked ownable synchronizers:
	- None

"Finalizer" #3 daemon prio=8 os_prio=0 cpu=1836.15ms elapsed=65039.30s tid=0x00007f8a387bf000 nid=0x13 in Object.wait()  [0x00007f8a3c122000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(java.base@11.0.20/Native Method)
	- waiting on <no object reference available>
	at java.lang.ref.ReferenceQueue.remove(java.base@11.0.20/ReferenceQueue.java:155)
	- waiting to re-lock in wait() <0x000000008001f390> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(java.base@11.0.20/ReferenceQueue.java:176)
	at java.lang.ref.Finalizer$FinalizerThread.run(java.base@11.0.20/Finalizer.java:170)

   Locked ownable synchronizers:
	- None

"Signal Dispatcher" #4 daemon prio=9 os_prio=0 cpu=0.51ms elapsed=65039.29s tid=0x00007f8a387d4800 nid=0x14 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
	- None

HFwas...小于 1 分钟jvmjavajvmjstatjstack
JVM - jstack dump信息详解
  • jstack输出的信息当中有以下几块内容:
    • JVM虚拟机的信息
    • Threads class SMR info
    • 线程信息
      • 线程基本信息
      • Thread Stack Trace
      • Locked ownable synchronizers
    • JVM Thread
    • JNI References

JVM虚拟机信息

  • 展示了虚拟机线程dump时间,使用的虚拟机的版本信息,如下图:

HFwas...大约 2 分钟jvmjavajvmjstatjstack