JVM性能调优监控工具之jstack

文章目录

一、概述  

二、语法  

三、测试实例      

四、线程与Monitor  


一、概述  

jstack是jdk自带的线程堆栈分析工具,使用该命令可以查看或导出 Java 应用程序中线程堆栈信息。

二、语法  

形式 :jstack [option] <pid>

参数说明:option为命令选项,常用选项如下:

  • -F当’jstack [-l] pid’没有相应的时候强制打印栈信息,如果直接jstack无响应时,用于强制jstack),一般情况不需要使用
  • -l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表,会使得JVM停顿得长久得多(可能会差很多倍,比如普通的jstack可能几毫秒和一次GC没区别,加了-l 就是近一秒的时间),-l 建议不要用。一般情况不需要使用
  • -m打印java和native c/c++框架的所有栈信息.可以打印JVM的堆栈,显示上Native的栈帧,一般应用排查不需要使用
  • pid:进程id,通过命令jps获得

三、测试实例      

1、运行如下代码:

public class Test {
	
	public static void main(String[] args) {
		while(true) {

		}
	}
}

2、执行jstack pid命令,查看pid进程内线程信息:

C:\Users\bikong>jstack 13244
2019-07-21 18:28:49
Full thread dump Java HotSpot(TM) Client VM (25.131-b11 mixed mode):

"Service Thread" #8 daemon prio=9 os_prio=0 tid=0x16370400 nid=0x3af0 runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE

"C1 CompilerThread0" #7 daemon prio=9 os_prio=2 tid=0x15a0a400 nid=0x2d64 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Attach Listener" #6 daemon prio=5 os_prio=2 tid=0x15a02c00 nid=0x1038 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" #5 daemon prio=9 os_prio=2 tid=0x15a00400 nid=0x3b44 runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Surrogate Locker Thread (Concurrent GC)" #4 daemon prio=9 os_prio=0 tid=0x159ff800 nid=0x28a4 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x159b9400 nid=0x3ad0 in Object.wait() [0x160bf000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
        - locked <0x04e13160> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x159b2c00 nid=0x3ebc in Object.wait() [0x1602f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
       ......

"VM Thread" os_prio=2 tid=0x159a1000 nid=0x3104 runnable

"Gang worker#0 (Parallel GC Threads)" os_prio=2 tid=0x0270a800 nid=0x35f8 runnable
......

"VM Periodic Task Thread" os_prio=2 tid=0x15a12400 nid=0x4420 waiting on condition

JNI global references: 1358

分析:

  • daemon表示线程是否是守护线程;
  • prio指线程的优先级;
  • os_prio指该线程对应的操作系统线程的优先级;
  • tid:java中线程编号;
  • nid:即native id,该线程对应的操作系统中本地线程编号,每一个java线程都有一个对应的操作系统线程。
  • "Finalizer":指线程名;
  • java.lang.Thread.State:指线程状态;
  • WAITING (on object monitor):表示该线程处于等待状态,括号中的内容说明了导致等待的原因。


四、线程与Monitor  

 

  • 进入区(Entrt Set):表示线程通过synchronized要求获取对象的锁。如果对象未被锁住,则迚入拥有者;否则则在进入区等待。一旦对象锁被其他线程释放,立即参与竞争。
  • 拥有者(The Owner):表示某一线程成功竞争到对象锁。
  • 等待区(Wait Set) :表示线程通过对象的wait方法,释放对象的锁,并在等待区等待被唤醒。

说明:一个 Monitor在某个时刻,只能被一个线程拥有,该线程就是 “Active Thread”,而其它线程“Waiting Thread”,分别在两个队列 “ Entry Set”和 “Wait Set”里面等候。在 “Entry Set”中等待的线程状态是 “Waiting for monitor entry”,而在“Wait Set”中等待的线程状态是 “in Object.wait()”。 被 synchronized保护起来的代码段为临界区当一个线程申请进入临界区时,它就进入了 “Entry Set”队列。

线程状态:

1、NEW:线程刚刚被创建,也就是已经new过了,但是还没有调用start()方法,jstack命令不会列出处于此状态的线程信息

2、RUNNABLERUNNABLE这个名字很具有欺骗性,很容易让人误以为处于这个状态的线程正在运行事实上,这个状态只是表示,线程是可运行的。一个单核CPU在同一时刻,只能运行一个线程。

3、BLOCKED:线程处于阻塞状态,正在等待一个监视器锁(monitor lock)。通常情况下,是因为本线程与其他线程公用了一个锁。其他在线程正在使用这个锁进入某个synchronized同步方法块或者方法,而本线程进入这个同步代码块也需要这个锁,最终导致本线程处于阻塞状态

4、WAITING:等待状态,等待某个condition或monitor发生,调用以下方法可能会导致一个线程处于等待状态:

wait() 不指定超时时间 join() 不指定超时时间; park() ;

5、TIMED_WAITING:线程等待指定的时间,对于以下方法的调用,可能会导致线程处于这个状态:

wait(long timeout) 指定超时时间; join(long millis) 指定超时时间; sleep(long millis) 指定超时时间

parkNanos(long nanos) ;  parkUntil(long deadline);

6、TERMINATED:线程终止。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值