Tags : jstack日志发表时间:

2019-03-17 23:53:19

在分析线上问题时常使用到jstack 命令将当时Java应用程序的线程堆栈dump出来。

面对jstack 日志,我们如何查看?

首先要清楚线程的状态

线程的状态有:new、runnable、running、waiting、timed_waiting、blocked、dead

线程状态变迁图:

各状态说明:

New: 当线程对象创建时存在的状态,此时线程不可能执行;

Runnable:当调用thread.start()后,线程变成为Runnable状态。只要得到CPU,就可以执行;

Running:线程正在执行;

Waiting:执行thread.join()或在锁对象调用obj.wait()等情况就会进该状态,表明线程正处于等待某个资源或条件发生来唤醒自己;

Timed_Waiting:执行Thread.sleep(long)、thread.join(long)或obj.wait(long)等就会进该状态,与Waiting的区别在于Timed_Waiting的等待有时间限制;

Blocked:如果进入同步方法或同步代码块,没有获取到锁,则会进入该状态;

Dead:线程执行完毕,或者抛出了未捕获的异常之后,会进入dead状态,表示该线程结束

其次,对于jstack日志,我们要着重关注如下关键信息

Deadlock:表示有死锁

Waiting on condition:等待某个资源或条件发生来唤醒自己。具体需要结合jstacktrace来分析,比如线程正在sleep,网络读写繁忙而等待

Blocked:阻塞 Waiting on monitor entry:在等待获取锁

in Object.wait():获取锁后又执行obj.wait()放弃锁

对于Waiting on monitor entry 和 in Object.wait()的详细描述:Monitor是 Java中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者 Class的锁。每一个对象都有,也仅有一个 monitor。从下图中可以看出,每个 Monitor在某个时刻,只能被一个线程拥有,该线程就是 "Active Thread",而其它线程都是 "Waiting Thread",分别在两个队列 " Entry Set"和 "Wait Set"里面等候。在 "Entry Set"中等待的线程状态是 "Waiting for monitor entry",而在 "Wait Set"中等待的线程状态是 "in Object.wait()"

最后通过示例来实践一下

示例一:描述 Blocked 和 Waiting to lock

执行后程序输出:

Thread[main,5,main]

说明主线程先进入同步代码块,获取到thread2对象上的锁。

通过jstack输出结果:

先说明下日志格式:

"thread2"为线程名称,在平时创建线程或线程池时请务必取一个见明之义的线程名称,方便排查问题;

prio=6:线程优先级,不用关心;

tid=0x0000000006540800:线程id,不用关心;

nid=0x2be4:操作系统映射的线程id, 非常关键,后面再使用jstack时补充;

waiting for monitor entry:表示线程正在等待获取锁

0x0000000006dbf000:线程栈起始地址

从jstack日志中,可以看到:主线程获取到thread2对象上的锁,因此正在执行sleep操作,状态为TIMED_WAINTING, 而thread2由于未获取到thread2对象上的锁,因此处于BLOCKED状态。

再细看,thread2 正在"waiting to lock <0x00000000d719d280>",即试图在地址为0x00000000d719d280所在的对象获取锁,而该锁却被main线程占有(locked <0x00000000d719d280>)。main线程正在"waiting on condition",说明正在等待某个条件触发,由jstacktrace来看,此线程正在sleep。

经验:如果在jstack日志发现大量的线程在waiting to lock 某个地址,只要能查到哪个线程获取到锁就可以方便定位问题了

示例二:描述waiting on condition

]

jstack日志输出结果:

从日志中可以看到,main线程的状态是Waiting,正在"waiting on condition"来唤醒自己。

结合jstackstrace日志来看,"parking to wait for <0x00000000d719ba70> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)"说明在调用ArrayBlockingQueue.put()阻塞了。

示例三:描述Object.wait()

程序输出结果:

Thread[thread2,5,main]

Thread[main,5,main]

说明线程thread2先进入同步代码块,获取到thread2对象上的锁。

jstack日志输出结果:

可以看出:线程thread2的状态是"Waiting", 正在"in Object.wait()"。表明该线程在获取到对象锁后,调用obj.wait()方法,放弃了锁,进入了"Wait Set"队列。

...阅读原文

jstack 脚本 自动日志_深入理解jstack日志相关推荐

  1. jstack 脚本 自动日志_运维老司机又翻车, 居然没用过日志切割Logrotate

    运维老司机又翻车, 居然没用过日志切割Logrotate 作为一个运维老司机, 这次又翻车了.只能说明一个原因, 就是菜, 所有才要多学习. 说起日志切割, 自己可以说是溜的一批.基本的套路就是在cr ...

  2. jstack 脚本 自动日志_GitLab从安装到全自动化备份一条龙

    原文地址[1]欢迎star 需求 1.在新服务器上安装并搭建好gitlab2.手动+自动将旧服务器上的gitlab备份3.手动+自动将gitlab备份包scp到新服务器上4.手动+自动恢复新服务器上的 ...

  3. 解读mysql日志_全方位解读 MySQL 日志实现内幕(四)

    作者介绍 王竹峰,去哪儿网数据库专家,擅长数据库开发.数据库管理及维护,一直致力于 MySQL 数据库源码的研究与探索,对数据库原理及实现具有深刻的理解.曾就职于达梦数据库,多年从事数据库内核开发的工 ...

  4. tp5记录用户的操作日志_【干货】日志管理与分析(四)日志管理规程

    接<日志管理与分析(三)--对日志系统的攻击>,如果你的企业没有认真地对待日志,那么就可以说明你的企业对IT可审核性并不重视,这也就是日志记录成为一种完善的依从性技术,许多法规和法律以及最 ...

  5. 删除部分mysql日志_正确删除MYSQl日志方法

    1.查找当 mysql> show binary logs; +------+---–+ | Log_name | File_size | +------+---–+ | mysql-bin.0 ...

  6. python 分析大数据日志_大数据Web日志分析 用Hadoop统计KPI指标实例

    可以带着下面问题来阅读文章 问题: 1.MapReduce在日志分析的作用 思考: 该如何架构kpi系统,需要考虑什么问题. kpi:关键绩效指标法,即KPI绩效考核,是企业绩效考核的方法之一,其特点 ...

  7. jstack 脚本 自动日志_在 Linux 中使用 Bash 脚本删除早于 “X” 天的文件/文件夹...

    该脚本可防止来自 监控工具 的警报,因为我们会在填满磁盘空间之前删除旧的日志文件. -- Magesh Maruthamuthu(作者) 磁盘使用率 监控工具能够在达到给定阈值时提醒我们.但它们无法自 ...

  8. jstack 脚本 自动日志_用jstack自动化捕抓异常java代码脚本

    #!/bin/bash date=` date +%y%m%d-%H%M` pid=`top -bn1 |grep java | awk '{print $1 "\t" $9}' ...

  9. java 分析jstack日志_望闻问切使用jstack和jmap剖析java进程各种疑难杂症

    最近碰到多起java程序导致服务器cpu使用率100%的情况,下面把排查解决方法记录下来. 其实遇到这种情况,首先要保持冷静的头脑,遇事不乱.然后望闻问切,找到病根,直达病灶.所谓望闻问切就是,首先使 ...

最新文章

  1. web service
  2. 【笔记】jstree插件的基本使用
  3. web版本 开源压测工具_标星 1.3K 的 Web 框架压测库,助你更好的选择框架
  4. 1 客户端性能--浏览器页面处理
  5. Sitemesh3的使用及配置
  6. java 参数 string_java(String和StringBuffer分别作为参数传递)
  7. 手机编写python脚本_python调用adb脚本来实现群控安卓手机初探
  8. 第一个SpringBoot项目——CRUD
  9. 怎么把3d风格的图变成2d_单图像三维重建、2D到3D风格迁移和3D DeepDream
  10. 智能问答系统方法综述
  11. oppo9s刷机教程_OPPO R9s刷机教程_OPPO R9s卡刷升级更新官方系统包
  12. mysql-22.MySQL有哪些“饮鸩止渴”提高性能的方法?
  13. 在国外期刊发表文章时一定用到的,SCI论文写法攻略
  14. 计算机通信机房消防要求,信息机房对环境有什么要求
  15. linux内核中锁有哪些,Linux内核中有哪些锁
  16. 常用设计模式-策略模式+工厂模式+模板模式(使用场景、解决方案)
  17. Android 仿京东商城购物车及源码
  18. 大数据清洗1(numpy之Ndarray对象)
  19. 风云再起 2017中国软件生态大会登陆上海
  20. matlab 异或运算符号,MATLAB运算符

热门文章

  1. 手机在线测试黄疸软件,在家怎么用手机测黄疸
  2. SVN提交时出现locked错误解决办法
  3. Java:File.separator作用相当于 ‘ \ ‘
  4. Springboot系列之Shiro、JWT、Redis 进行认证鉴权
  5. WebMvcConfigurerAdapter过时的替换方法
  6. mysql实现内容加密_简单为mysql 实现透明加密方法
  7. python使用xlrd读取xlsx文件_$ 用python处理Excel文档(1)——用xlrd模块读取xls/xlsx文档...
  8. bloomberg用法 固定收益_内部收益率的用法浅谈某保险的真实收益率
  9. php和java 2017_Php与java的区别
  10. 北京师范大学新生入学计算机考试内容,北京师范大学