JVM 监控工具——jstack
【参考文章】:jstack 命令使用经验总结
1. 简介
jstack主要用于生成java虚拟机当前时刻的线程快照。
线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,
主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等
2. 基本用法

2.1 jstack <pid>
输出当前时刻该进程的线程快照信息;
一般分为三个部分:
第一部分为是当前快照的时间信息和JVM的信息;
示例:

第二部分为多个线程的执行情况,我们选取一个线程作为示例进行分析;
示例:

main:线程名称;
prio:线程优先级;
os_prio:线程优先级;
tid:线程ID;
nid:映射到Linux系统中的轻量级进程PID,快照中用16进制表示,可转为10进制在系统中进行查看;
线程当前动作:
一般记录在每个 thread dump 的第一行末尾;
runnable:表示线程在参数CPU竞争,可能在被调度运行,也可能在就绪等待;
sleeping:表示调用了 Thread.sleep(),线程进入休眠;
waiting on condition [0x...]:表示线程被阻塞原语所阻塞, 方括号内的地址表示线程等待的资源地址; 这种和 jvm 的内置锁体系没有关系, 它是 jdk5 之后的 java.util.concurrent.locks.Condition 包下的锁机制;
waiting for monitor entry [0x...]:表示线程在试图获取内置锁, 进入了等待区 Entry Set, 方括号内的地址表示线程等待的资源地址;
in Object.wait() [0x...]: 表示线程调用了 object.wait(), 放弃了内置锁, 进入了等待区 Wait Set, 等待被唤醒, 方括号内的地址表示线程放弃的资源地址;
Thread.State:
RUNNABLE:这种一般与线程动作 runnable 一起出现;
BLOCKED (on object monitor): 这种一般与线程动作 waiting for monitor entry 一起出现, 不过在其线程调用栈最末端并没有一个固定的方法, 因为 synchronized 关键字可以修饰各种方法或者同步块;
WAITING (on object monitor) 或者 TIMED_WAITING (on object monitor): 这种一般与线程动作 in Object.wait() [0x...] 一起出现, 并且线程调用栈的最末端调用方法为 at java.lang.Object.wait(Native Method), 以表示 object.wait() 方法的调用;
另外, WAITING 与 TIMED_WAITING 的区别在于是否设置了超时中断, 即 wait(long timeout) 与 wait() 的区别;
WAITING (parking) 或者 TIMED_WAITING (parking): 这种一般与线程动作 waiting on condition [0x...] 一起出现, 并且线程调用栈的最末端调用方法一般为 at sun.misc.Unsafe.park(Native Method);
Unsafe.park 使用的是线程阻塞原语, 主要在 java.util.concurrent.locks.AbstractQueuedSynchronizer 类中被使用到, 很多基于 AQS 构建的同步工具, 如 ReentrantLock, Condition, CountDownLatch, Semaphore 等都会诱发线程进入该状态;
另外, WAITING 与 TIMED_WAITING 的区别与第三点中提到的原因一致;
线程的重要调用修饰:
thread dump 的线程调用栈中, 一般会把与锁相关的资源使用状态以附加的形式作重点修饰, 这与线程的动作及状态有着密切的联系, 一般情况下可分为如下几类:
locked <0x...>, 表示其成功获取了内置锁, 成为了 owner;
parking to wait for <0x...>, 表示其被阻塞原语所阻塞, 通常与线程动作 waiting on condition 一起出现;
waiting to lock <0x...>, 表示其在 Entry Set 中等待某个内置锁, 通常与线程动作 waiting for monitor entry 一起出现;
waiting on <0x...>, 表示其在 Wait Set 中等待被唤醒, 通常与线程动作 in Object.wait() [0x...] 一起出现;
第三部分为JVM级别的信息
示例:

VM Thread:虚拟机线程;
VM Periodic Task Thread:虚拟机的工作任务线程;
JNI global references :JNI 全局引用个数;
2.2 jstack -F -m -l <pid>
-F:进程没有响应时强制打印堆栈信息;
-m:打印 Java 和 native C、C++ 的堆栈信息;
-l:打印关于锁的附加信息
当使用 -F -m 参数时,都会进行死锁的检测,打印的 thread dump 信息会包含如下信息:

当使用 -l 参数时,输出当前线程持有的锁的地址和类型,没有则显示为None:

JVM 监控工具——jstack的更多相关文章
- JVM 监控工具 jstack 和 jvisualvm 的使用
Java线程状态 线程的五种状态 * 新建:new(时间很短) * 运行:runnable * 等待:waitting(无限期等待),timed waitting(限期等待) * 阻塞:blocked ...
- Java内存泄露监控工具:JVM监控工具介绍
本文将对JVM监控工具jstack, jconsole, jinfo, jmap, jdb, jstat进行详细的介绍,具体内容请看下文 Sun JDK监控和故障处理工具 名称 主要作用 jps JV ...
- JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jsta
JVM监控工具介绍 jstack - 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程 ...
- JVM监控工具介绍
JVM监控工具介绍 VisualVM是一种集成了多个JDK命令行工具的可视化工具,它能为您提供强大的分析能力.所有这些都是免费的!它囊括的命令行工具包括jps,jstat,jmap,jinfo,jst ...
- jvm 监控工具
背景 不懂jvm监控工具好意思说自己搞java的吗.其实搞了十多年的人我都见过不懂得,不懂不要紧,老实工作就行啊.这就是属于非技术的话题了,实在不知从何说起.还是赶紧学习下吧,可以去装了.我认真学习后 ...
- Java之JVM监控工具分享
Java之JVM监控工具分享 JVM的基本知识常用的也就是类加载机制,内存区域.分配.OOM,GC,JVM参数调优 几个链接自己看: 内存区域&类加载机制 分配策略&垃圾回收算法.收集 ...
- 常见JVM监控工具用法介绍
VisualVM是一种集成了多个JDK命令行工具的可视化工具,它能为您提供强大的分析能力.所有这些都是免费的!它囊括的命令行工具包括jps,jstat,jmap,jinfo,jstack,JConso ...
- JVM监控工具用法指导
JVM监控工具用法指导 2010-09-27 15:39 dolphin-ygj javaeye.com 字号:T | T 通过JVM监控工具的使用可以及时发现问题,剔除安全隐患,这里向大家描述一下常 ...
- Java线程及Jvm监控工具
Java线程状态 线程的五种状态 * 新建:new(时间很短) * 运行:runnable * 等待:waitting(无限期等待),timed waitting(限期等待) * 阻塞:blocked ...
随机推荐
- Java高并发程序设计学习笔记(四):无锁
转自:https://blog.csdn.net/dataiyangu/article/details/86440836#1__3 1. 无锁类的原理详解简介:1.1. CAS1.2. CPU指令2. ...
- 02.Zabbix⾃定义监控项
1.zabbix⾃定义监控初试 如何获取系统中想监控对象的值,获取后⼜如何将该值传递给Zabbix-Server 1.1.监控系统中的对象 #(系统监控命令 + awk + 筛选条件 = 监控的状态值 ...
- 第五章·Logstash深入-日志收集
1.Logstash收集单个日志到文件中 file模块收集日志 不难理解,我们的日志通常都是在日志文件中存储的,所以,当我们在使用INPUT插件时,收集日志,需要使用file模块,从文件中读取日志的内 ...
- Vivotek 摄像头远程栈溢出漏洞分析及利用
Vivotek 摄像头远程栈溢出漏洞分析及利用 近日,Vivotek 旗下多款摄像头被曝出远程未授权栈溢出漏洞,攻击者发送特定数据可导致摄像头进程崩溃. 漏洞作者@bashis 放出了可造成摄像头 C ...
- docker使用上的错误
docker启动问题 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon ...
- 关于单机部署fastdfs遇到的问题
查找错误日志显示:/html/group1/M00/00/00/wKjJWFzdF0qAE1pBAACmOw57Lw0520_big.jpg" failed (2: No such file ...
- Linux使用wget仿站
运行命令 $ wget -r -p -np -k www.avatrade.cn 参数说明 -r --recursive(递归) specify recursive download.(指定递归下载) ...
- Windows bat脚本的for语句
Windows bat脚本的for语句基本形态如下: 在cmd窗口中:for %I in (command1) do command2 在批处理文件中:for %%I in (command1) do ...
- js页面重定向跳转代码总结(待续)
情形一:东八区,浏览器中文跳转 <script type="text/javascript"> var sLang = (navigator.language ? na ...
- sql 实现取表中相同id时间最大的一行 利用distinct on
数据表是这样的 select * from water_level_records m where ( select count(*) from water_level_records n where ...