大数跨境

Java项目性能瓶颈分析及定位(四)——Java线程堆栈分析(二)

Java项目性能瓶颈分析及定位(四)——Java线程堆栈分析(二) 慧测
2017-08-11
1
导读:Java项目性能瓶颈分析及定位系列文章

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



    

如何输出线程堆栈?

考虑到Java项目的运行平台大部分都是Unix/Linux,所以文章中涉及的环境默认都是Linux的。如果有windows的需求你搞不定,直接呼我吧!


工作中最常用的线程堆栈dump方式主要有三种:

  1. Unix/Linux自身命令,kill -3 <java pid> (java pid:java进程ID)

  2. Jdk自带命令行工具,jstack (最常用)

  3. Jdk自带或者第三方图形化界面,例如jvisualvm、jprofiler等。


用一个tomcat的例子来演示一下上面的三种方式吧!


第一步,查看tomcat的进程ID(pid)

不管哪种方式对线程栈做dump,都必须要获取该应用的进程编号哦!


第二步,对pid是15197的进程做dump

  1. 使用kill -3

可以看到,命令执行过之后,线程堆栈信息并没有在终端界面显示,到哪里去了呢?


Java虚拟机提供了线程转储(Thread dump)的后门, 通过这个后门, 可以将线程堆栈打印出来。 这个后门就是通过向Java进程发送一个QUIT信号, Java虚拟机收到该信号之后, 将系统当前的JAVA线程调用堆栈打印出来。 有的虚拟机实现( 如SUN JDK) 堆栈信息将打印在屏幕上。 另外有的虚拟机实现( 如IBM JDK) 直接将线程堆栈打印到一个文件中, 从当前的运行目录下可以找到该文件。 如果JDK将线程堆栈打印在屏幕上, 由于信息量太大( 一般的系统都有几千行或者几万行), 经常会超出控制台缓冲区的最大行数限制造成信息丢失, 因此最好手工进行重定向到一个文件中。


所以启动tomcat的时候是把日志信息重定向到catalina.out这个文件里面了,使用tail -f catalina.out监控一下,截取一段看看


  1. jstack

这是我最常用的dump方式了,工作中基本是如下命令:

jstack 15197 > 201708111020.tdump

把dump的文件下载下来,使用图形化工具就可以打开直接分析了


  1. 图形化工具

jvisualvm、jconsole、jprofiler等等这些工具都可以滴,这里就用jvisualvm做为例子吧!


个人感觉Jprofiler的强大之处更多在于对堆内存的监控,后面我会重点去写,线程栈这块有点弱。经验之谈,纯粹个人感觉!


  • 本地监控

本地监控可以直接通过进程的方式监控,如果本地有java进程,打开 jvisualvm后可以直接看到对应的进程信息,双击打开就可以了。

直接点击界面上的线程dump就可以啦,So easy!


  • 远程监控

远程监控需要配置jmxjstatd(这是什么玩意?实在看不明白的可以直接问我),具体怎么配置自行百度一下吧,如果不成功直接加微信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

公众号:慧测


【声明】内容源于网络
0
0
慧测
专注人工智能前沿技术落地企业实战应用
内容 404
粉丝 0
慧测 专注人工智能前沿技术落地企业实战应用
总阅读104
粉丝0
内容404