怎的使用jstack诊断Java应用程序故障
http://www.myexception.cn/javascript/1030478.html
怎样使用jstack诊断Java应用程序故障
最近一段时间,我们的生产系统升级频繁出现故障,具体故障现象是启动后10来分钟就出现交易缓慢,处理线程耗尽等现象,并且故障发生的频率蛮高的。经过详细的诊断和排查,终于发现了问题,是groovy在osgi中运行会出现classloader死锁,最后我们也解决了这个问题。
如果单靠通过查看代码是很难去发现这个问题,在这一次故障排查中,我也学到了怎样更好的使用jvm监控工具来进行诊断,主要用到了jstack和jmap命令,jmap上次已经讲过就不再讲了,下面就一个例子来讲怎么使用jstack来对的Java程序进行诊断。
首先让我们来了解一下jstack这个命令的作用,jstack 是一个可以返回在应用程序上运行的各种各样线程的一个完整转储的实用程序,您可以使用它查明问题。jstack [-l] <pid>,jpid可以通过使用jps命令来查看当前Java程序的jpid值,-l是可选参数,它可以显示线程阻塞/死锁情况。
/*** 死锁例子* @author crane.ding* @since 2011-3-20*/
public class DeadLock {public static void main(String[] args) {final Object obj_1 = new Object(), obj_2 = new Object();Thread t1 = new Thread("t1"){@Overridepublic void run() {synchronized (obj_1) {try {Thread.sleep(3000);} catch (InterruptedException e) {}synchronized (obj_2) {System.out.println("thread t1 done.");}}}};Thread t2 = new Thread("t2"){@Overridepublic void run() {synchronized (obj_2) {try {Thread.sleep(3000);} catch (InterruptedException e) {}synchronized (obj_1) {System.out.println("thread t2 done.");}}}};t1.start();t2.start();}}
以上DeadLock类是一个死锁的例子,假使在我们不知情的情况下,运行DeadLock后,发现等了N久都没有在屏幕打印线程完成信息。这个时候我们就可以使用jps查看该程序的jpid值和使用jstack来生产堆栈结果问题。
$ java -cp deadlock.jar DeadLock & $
$ jps3076 Jps448 DeadLock $ jstack -l 448 > deadlock.jstack
结果文件deadlock.jstack内容如下:
2011-03-20 23:05:20 Full thread dump Java HotSpot(TM) Client VM (19.1-b02 mixed mode, sharing):"DestroyJavaVM" prio=6 tid=0x00316800 nid=0x9fc waiting on condition [0x00000000]java.lang.Thread.State: RUNNABLELocked ownable synchronizers:- None"t2" prio=6 tid=0x02bcf000 nid=0xc70 waiting for monitor entry [0x02f6f000]java.lang.Thread.State: BLOCKED (on object monitor)at com.demo.DeadLock$2.run(DeadLock.java:40)- waiting to lock <0x22a297a8> (a java.lang.Object)- locked <0x22a297b0> (a java.lang.Object)Locked ownable synchronizers:- None"t1" prio=6 tid=0x02bce400 nid=0xba0 waiting for monitor entry [0x02f1f000]java.lang.Thread.State: BLOCKED (on object monitor)at com.demo.DeadLock$1.run(DeadLock.java:25)- waiting to lock <0x22a297b0> (a java.lang.Object)- locked <0x22a297a8> (a java.lang.Object)Locked ownable synchronizers:- None"Low Memory Detector" daemon prio=6 tid=0x02bb9400 nid=0xa6c runnable [0x00000000]java.lang.Thread.State: RUNNABLELocked ownable synchronizers:- None"CompilerThread0" daemon prio=10 tid=0x02bb2800 nid=0xcb8 waiting on condition [0x00000000]java.lang.Thread.State: RUNNABLELocked ownable synchronizers:- None"Attach Listener" daemon prio=10 tid=0x02bb1000 nid=0x7f4 waiting on condition [0x00000000]java.lang.Thread.State: RUNNABLELocked ownable synchronizers:- None"Signal Dispatcher" daemon prio=10 tid=0x02bd2800 nid=0xd80 runnable [0x00000000]java.lang.Thread.State: RUNNABLELocked ownable synchronizers:- None"Finalizer" daemon prio=8 tid=0x02bab000 nid=0xe1c in Object.wait() [0x02d3f000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x229e1148> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)- locked <0x229e1148> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)Locked ownable synchronizers:- None"Reference Handler" daemon prio=10 tid=0x02ba6800 nid=0xbe0 in Object.wait() [0x02cef000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x229e1048> (a java.lang.ref.Reference$Lock)at java.lang.Object.wait(Object.java:485)at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)- locked <0x229e1048> (a java.lang.ref.Reference$Lock)Locked ownable synchronizers:- None "VM Thread" prio=10 tid=0x02b6a400 nid=0x568 runnable "VM Periodic Task Thread" prio=10 tid=0x02bc8400 nid=0x75c waiting on condition JNI global references: 878Found one Java-level deadlock: ============================= "t2":waiting to lock monitor 0x02baaeec (object 0x22a297a8, a java.lang.Object),which is held by "t1" "t1":waiting to lock monitor 0x02baa2bc (object 0x22a297b0, a java.lang.Object),which is held by "t2"Java stack information for the threads listed above: =================================================== "t2":at com.demo.DeadLock$2.run(DeadLock.java:40)- waiting to lock <0x22a297a8> (a java.lang.Object)- locked <0x22a297b0> (a java.lang.Object) "t1":at com.demo.DeadLock$1.run(DeadLock.java:25)- waiting to lock <0x22a297b0> (a java.lang.Object)- locked <0x22a297a8> (a java.lang.Object)Found 1 deadlock.
从这个结果文件我们一看到发现了一个死锁,具体是线程t2在等待线程t1,而线程t1在等待线程t2造成的,同时也记录了线程的堆栈和代码行数,通过这个堆栈和行数我们就可以去检查对应的代码块,从而发现问题和解决问题。
jps
jstat
jstack
jinfo
jmap
.....
这是无工具环境的最后的手段, 可以好好学学使用。 我基本用这些能解决99%的问题哦。
转载于:https://blog.51cto.com/liuer/1354806
怎的使用jstack诊断Java应用程序故障相关推荐
- 诊断DB2 Java应用程序的性能问题
问题诊断和 DB2 架构简介 本文的目的是帮助应用程序开发人员或数据库管理员排除和诊断在部署 Java 应用程序时可能遇到的常见性能问题.其中包括常见的应用程序开发问题,例如挂起或者响应缓慢. 很好地 ...
- java应用程序占用高内存_对Java应用程序中的内存问题进行故障排除
java应用程序占用高内存 重要要点 解决内存问题可能很棘手,但是正确的方法和正确的工具集可以大大简化此过程. Java HotSpot JVM可以报告几种OutOfMemoryError消息,因此务 ...
- AidLearning安装Oracle JDK让Java Swing程序在华为MatePadPro平板上跑起来
AidLearning安装Oracle JDK让Java Swing程序在华为MatePadPro平板上跑起来 cemike@126.com 入手华为MatePadPro平板以后就有把windows台 ...
- java 正则 cpu 100_这六个原因真的可以使Java应用程序的CPU使用率飙升到100%吗?...
点击上方的"代码农户的冥想记录",然后选择"设为明星" 高质量文章,及时交付 问题 1. 无限while循环会导致CPU使用率飙升吗? 2.经常使用Young ...
- Java应用程序性能监视:复杂的分布式应用程序的端到端性能
通过从应用程序中学习企业APM产品,发现更快,更高效的性能监控. 参加AppDynamics APM导览! 在最复杂和分布式环境中端到端监视Java应用程序性能-专注于业务事务. 自动发现的业务交易, ...
- java 代码检验表不存在_诊断 Java 代码: Liar View 错误模式
[IT168 技术文章]GUI 一般是基于模型-视图-控制器体系结构设计的.其中,视图是从模型中分离出来的.这种分离对自动化测试是一个挑战,因为我们很难检验模型中的状态改变是否在视图中得到了适当的反映 ...
- java进程cpu使用率高_什么会导致Java应用程序的CPU使用率飙升?
问题 无限循环的while会导致CPU使用率飙升吗? 经常使用Young GC会导致CPU占用率飙升吗? 具有大量线程的应用程序的CPU使用率是否较高? CPU使用率高的应用程序的线程数是多少? 处于 ...
- LINUX类主机JAVA应用程序占用CPU、内存过高分析手段
本文转载 线上应用故障排查之一:高CPU占用 DBA+社群(dbaplus)丁启良 1. 应用程序占用资源高问题 目前大部分应用程序采用的是JAVA语言开发,在产品上线使用一段时间后,经常会出现某个J ...
- java代码耗尽内存_为什么运行Java应用程序的计算机几乎耗尽了物理内存,但仍然可以运行数周...
我有一个Java应用程序,该应用程序部署在两台计算机上,并根据指标(包括JMC)判断它们都几乎耗尽了内存,并且持续了很长时间.但是,这些应用程序可以正常运行,并且不会发生OutOfMemory错误. ...
最新文章
- IPython 8.0大版本更新:Debug报错提示更清晰,加入自动代码补全
- python新手入门-python新手入门方法
- PowerBuilder窗口之间传递多参数的方法
- 【正一专栏】登贝莱,该不该来!
- JS拼凑方法之join
- Linux修改文件/目录权限
- C++中 auto自动变量,命名空间,using作用以及作用域
- Tensorflow实战系列之五:
- scrapy学习资料汇总
- Eigen(3)矩阵Matrix及其简单操作
- oracle 导出 cuow,直通伍伦贡大学的升学保障— 伍伦贡大学学院(UOWC)
- C#LeetCode刷题之#278-第一个错误的版本(First Bad Version)
- NPOI设置Excel中的单元格识别为日期
- php学生管理系统整理
- Android Resources Overview —— Android 资源文件
- android控制动态按钮,Android编程动态按钮实现方法
- 模式匹配与正则表达式(一)
- 推荐几个非常刺激的公众号
- 二十九岁,刚读完了财富启蒙读物《小狗钱钱》
- 华为天才少年:武大94年博士!江山代有才人出,不拘一格降人才!
热门文章
- DataBseDesign工作笔记001---基于RBAC用户权限管理数据库设计_用图的形式说明_精确到页面的元素
- springcache使用笔记001_注释驱动的 Spring cache 简单使用
- Android学习笔记---09_深入了解各种布局技术
- 运行stam 遇到的问题:
- v540 检测的问题
- [入门]Ruby on Rails入门教程及开发工具选用
- Startup Script for Python(x,y)
- windows qt 使用openssl API
- CStdioFile读写文件的问题
- Java代码怎么取消订阅功能,RxJava2 中多种取消订阅 dispose 的方法梳理( 源码分析 )...