扫描二维码,报名慧测免费公开课

如何输出线程堆栈?
考虑到Java项目的运行平台大部分都是Unix/Linux,所以文章中涉及的环境默认都是Linux的。如果有windows的需求你搞不定,直接呼我吧!
工作中最常用的线程堆栈dump方式主要有三种:
Unix/Linux自身命令,kill -3 <java pid> (java pid:java进程ID)
Jdk自带命令行工具,jstack
(最常用) Jdk自带或者第三方图形化界面,例如jvisualvm、jprofiler等。
用一个tomcat的例子来演示一下上面的三种方式吧!
第一步,查看tomcat的进程ID(pid)

不管哪种方式对线程栈做dump,都必须要获取该应用的进程编号哦!
第二步,对pid是15197的进程做dump
使用kill -3

可以看到,命令执行过之后,线程堆栈信息并没有在终端界面显示,到哪里去了呢?
Java虚拟机提供了线程转储(Thread dump)的后门, 通过这个后门, 可以将线程堆栈打印出来。 这个后门就是通过向Java进程发送一个QUIT信号, Java虚拟机收到该信号之后, 将系统当前的JAVA线程调用堆栈打印出来。 有的虚拟机实现( 如SUN JDK) 堆栈信息将打印在屏幕上。 另外有的虚拟机实现( 如IBM JDK) 直接将线程堆栈打印到一个文件中, 从当前的运行目录下可以找到该文件。 如果JDK将线程堆栈打印在屏幕上, 由于信息量太大( 一般的系统都有几千行或者几万行), 经常会超出控制台缓冲区的最大行数限制造成信息丢失, 因此最好手工进行重定向到一个文件中。
所以启动tomcat的时候是把日志信息重定向到catalina.out这个文件里面了,使用tail -f catalina.out监控一下,截取一段看看

jstack
这是我最常用的dump方式了,工作中基本是如下命令:
jstack 15197 > 201708111020.tdump

把dump的文件下载下来,使用图形化工具就可以打开直接分析了
图形化工具
jvisualvm、jconsole、jprofiler等等这些工具都可以滴,这里就用jvisualvm做为例子吧!
个人感觉Jprofiler的强大之处更多在于对堆内存的监控,后面我会重点去写,线程栈这块有点弱。经验之谈,纯粹个人感觉!
本地监控
本地监控可以直接通过进程的方式监控,如果本地有java进程,打开 jvisualvm后可以直接看到对应的进程信息,双击打开就可以了。

直接点击界面上的线程dump就可以啦,So easy!
远程监控
远程监控需要配置jmx、jstatd(这是什么玩意?实在看不明白的可以直接问我),具体怎么配置自行百度一下吧,如果不成功直接加微信13401182883,我单独发你配置好的文件。
可以看到线程的状态以及GC的实时信息,也算是很强大的工具吧!

下一篇文章咱们开始读懂堆栈......
本着学习交流之目的,如有错误或不当之处,欢迎批评指正,共同进步!
2017年8月16日起,慧测免费公开课系列正式开启——
连续两个月的Java语言+Selenium实战尽在慧测腾讯课堂!
软件测试工程师专属的Java语言学习盛宴!
紧密围绕性能测试、自动化测试、测试开发所必备的Java编程知识讲解!
为后续一个月免费的Selenium实战课程学习做准备!
本系列公开课报名地址:
https://ke.qq.com/course/229575#tuin=3e1d63a
或者扫描下方二维码直接报名

感谢您关注慧测:
慧测官网:www.huicewang.com
慧测公开课服务群: 623636110
课程咨询微信/QQ:18518511087/2657535456
公众号:慧测


