如何使用jstack分析线程状态

转载自  如何使用jstack分析线程状态

背景

记得前段时间,同事说他们测试环境的服务器cpu使用率一直处于100%,本地又没有什么接口调用,为什么会这样?cpu使用率居高不下,自然是有某些线程一直占用着cpu资源,那又如何查看占用cpu较高的线程?

当然一个正常的程序员不会写出上述代码,这里只是为了让一个线程占用较高的cpu资源。

top命令

在linux环境下,可以通过top命令查看各个进程的cpu使用情况,默认按cpu使用率排序

1、上图中可以看出pid为23344的java进程占用了较多的cpu资源;
2、通过top -Hp 23344可以查看该进程下各个线程的cpu使用情况;

上图中可以看出pid为25077的线程占了较多的cpu资源,利用jstack命令可以继续查看该线程当前的堆栈状态。

jstack命令

通过top命令定位到cpu占用率较高的线程之后,继续使用jstack pid命令查看当前java进程的堆栈状态

jstack命令生成的thread dump信息包含了JVM中所有存活的线程,为了分析指定线程,必须找出对应线程的调用栈,应该如何找?

在top命令中,已经获取到了占用cpu资源较高的线程pid,将该pid转成16进制的值,在thread dump中每个线程都有一个nid,找到对应的nid即可;隔段时间再执行一次stack命令获取thread dump,区分两份dump是否有差别,在nid=0x246c的线程调用栈中,发现该线程一直在执行JstackCase类第33行的calculate方法,得到这个信息,就可以检查对应的代码是否有问题。

通过thread dump分析线程状态

除了上述的分析,大多数情况下会基于thead dump分析当前各个线程的运行情况,如是否存在死锁、是否存在一个线程长时间持有锁不放等等。

在dump中,线程一般存在如下几种状态:
1、RUNNABLE,线程处于执行中
2、BLOCKED,线程被阻塞
3、WAITING,线程正在等待

实例1:多线程竞争synchronized锁

很明显:线程1获取到锁,处于RUNNABLE状态,线程2处于BLOCK状态
1、locked <0x000000076bf62208>说明线程1对地址为0x000000076bf62208对象进行了加锁;
2、waiting to lock <0x000000076bf62208> 说明线程2在等待地址为0x000000076bf62208对象上的锁;
3、waiting for monitor entry [0x000000001e21f000]说明线程1是通过synchronized关键字进入了监视器的临界区,并处于”Entry Set”队列,等待monitor,具体实现可以参考深入分析synchronized的JVM实现;

实例2:通过wait挂起线程
static class Task implements Runnable {@Overridepublic void run() {synchronized (lock) {try {lock.wait();//TimeUnit.SECONDS.sleep(100000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

dump结果

线程1和2都处于WAITING状态
1、线程1和2都是先locked <0x000000076bf62500>,再waiting on <0x000000076bf62500>,之所以先锁再等同一个对象,是因为wait方法需要先通过synchronized获得该地址对象的monitor;
2、waiting on <0x000000076bf62500>说明线程执行了wait方法之后,释放了monitor,进入到”Wait Set”队列,等待其它线程执行地址为0x000000076bf62500对象的notify方法,并唤醒自己,具体实现可以参考深入分析Object.wait/notify实现机制;


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA网络编程实战(笔记)

计算机网络简介 网络编程的目的&#xff1a; 无限电台。。。。传播交流信息&#xff0c;数据交换。通信 想要达到这个效果需要什么&#xff1a; 1.如何准确的定位网络上的一台主机 ip地址192.168.16.124&#xff1a; 端口&#xff0c;定位到这个计算机上的某个资源 2.找到…

让 Java 应用运行更快:性能调优工具及实践

转载自 让 Java 应用运行更快&#xff1a;性能调优工具及实践Java 应用性能优化是一个老生常谈的话题&#xff0c;笔者根据个人经验&#xff0c;将 Java 性能优化分为 4 个层级&#xff1a;应用层、数据库层、框架层、JVM 层。通过介绍 Java 性能诊断工具和思路&#xff0c;给…

github 公钥 私钥_github快速使用

##第一次使用github推荐方式Git第一步&#xff1a;下载git工具&#xff0c;这里是链接&#xff0c;选择适合自己的版本进行安装。第二步&#xff1a;安装完成后&#xff0c;鼠标右键找到Git bash&#xff0c;双击打开。第三步&#xff1a;设置SSH key众所周知ssh是加密传输。加…

ASP.NET Core 之 Identity 入门(一)

前言 在 ASP.NET Core 中&#xff0c;仍然沿用了 ASP.NET里面的 Identity 组件库&#xff0c;负责对用户的身份进行认证&#xff0c;总体来说的话&#xff0c;没有MVC 5 里面那么复杂&#xff0c;因为在MVC 5里面引入了OWIN的东西&#xff0c;所以很多初学者在学习来很费劲&…

蓝桥杯JAVA省赛2013-----B------2(马虎算式)

二、马虎的算式 【解析】&#xff1a;暴力穷举即可 枚举每个位上的数字、组合判断、暴力穷举 【答案】&#xff1a;142 方法一&#xff1a;暴力穷举 package com.kuang.Test; public class Test{public static void main(String[] args) {int ans 0;for(int a 1; a < …

简单解决“无法打开内核设备:\\Global\\vmx86”错误

简单解决“无法打开内核设备:\\Global\\vmx86”错误 本文链接&#xff1a;https://blog.csdn.net/tristan_tian/article/details/79434715 我是win10系统&#xff0c;在小娜搜索“服务”后右击选择使用管理员打开。然后在一大串服务中找到vm开头的服务项&#xff0c;全部都启…

按钮右对齐_Python Tkinter Button按钮

简介BUTTON小工具时使用的按钮添加到各种类型的Python应用&#xff0c;Python允许用户配置按钮的按我们的要求&#xff0c;各种选项可以被设置或重置的要求。BUTTON 小工具时使用的按钮添加到各种类型的Python应用。Python允许用户配置按钮的按我们的要求。各种选项可以被设置或…

Java 内存查看与分析

转载自 Java 内存查看与分析1&#xff1a;gc日志输出在jvm启动参数中加入 -XX:PrintGC -XX:PrintGCDetails -XX:PrintGCTimestamps -XX:PrintGCApplicationStopedTime&#xff0c;jvm将会按照这些参数顺序输出gc概要信息&#xff0c;详细信息&#xff0c;gc时间信息&#xff…

【长文干货】浅析分布式系统

测试开发者的共同关注&#xff01; 作者&#xff1a;wadehan&#xff0c;腾讯后台开发高级工程师 商业转载请联系腾讯WeTest获得授权&#xff0c;非商业转载请注明出处。 WeTest导读 我们常常会听说&#xff0c;某个互联网应用的服务器端系统多么牛逼&#xff0c;比如QQ、微信、…

hibernate配置详情2(Dept.hbm.xml)

<?xml version"1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package"org.hibernate_on…

Spring Boot 入门 IDEA 版本 2小时学会springBoot 代码上传至gitee 或者github 事务没做出来

SpringBoot简化了xml的配置可以快速开发&#xff0c;节省很多的时间&#xff0c;springboot的配置速度更快&#xff0c;SpringMvc已经不如springboot了&#xff0c; 市面上更多的是使用spingboot这个框架了。 springboot是springmvc的升级版&#xff0c;但是2者没有必然的联…

华为云微认证答题_158人次通过华为认证考试!今年,湖北这所高校频现大动作...

从2005全国职教工作会上"校企合作"的提出&#xff0c;到2013年"产教融合"的最早出现&#xff0c;再到党的十九大&#xff0c;"产教融合、校企合作"已经逐渐成为教育新趋势。相信有许多家长和大学生都很想了解这种新的教育模式。本期推送&#xf…

在传统.NET Framework 上运行ASP.NET Core项目

新的项目我们想用ASP.NET Core来开发&#xff0c;但是苦于我们历史的遗产很多&#xff0c;比如《使用 JavaScriptService 在.NET Core 里实现DES加密算法》&#xff0c;我们要估计等到.NET Core 1.2我们才会有大部分的API&#xff0c;通过NodeJs方式有点曲线救国的味道&#xf…

JVM 调优系列之图解垃圾回收

转载自 JVM 调优系列之图解垃圾回收摘要: jvm必知系列&#xff0c;总结一些常见jvm回收机制&#xff0c;方便查阅从这篇开始我们开始探讨一些jvm调优的问题。在jvm调优中一个离不开的重点是垃圾回收&#xff0c;当垃圾回收成为系统达到更高并发量的瓶颈时&#xff0c;我们就需…

JAVA注解和反射(笔记)

注解简介 Annotation是从JDK5.0开始引入的新技术). Annotation的作用 : 不是程序本身(可以对程序作出解释.(这一点和注释(comment)没什么区别)可以被其他程序(比如:编译器等)读取. Annotation的格式: 注解是以"注释名"在代码中存在的, 还可以添加一些参数值,例如:S…

车提示检测轮胎气压_水淹车估价中心_辽宁中车检

首页 > 新闻中心发布时间&#xff1a;2021-01-02 00:57:13 导读&#xff1a;辽宁中车检为您提供水淹车估价中心的相关知识与详情&#xff1a;在行车过程中,汽车受到振动,可能会引起前照灯部件的安装位置发生变动,从而改变光束的正确照射方向.同时,灯泡在使用过程中会逐步老化…

.NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

0x00 为什么需要Map&#xff08;MapWhen&#xff09;扩展 如果业务逻辑比较简单的话&#xff0c;一条主管道就够了&#xff0c;确实用不到Map。不过当业务逻辑比较复杂的时候&#xff0c;有时候我们可能希望根据情况的不同使用特殊的一组中间件来处理HttpContext。这种情况下如…

2小时学习Spring Boot 2019版本 代码一样推送至github上面去

简介&#xff1a;《2小时学习Spring Boot》后续进阶课程&#xff0c;主要讲述了Spring Boot针对Web方面的相关技巧 讲师实战课程《Spring Boot微信点餐系统》 http://coding.imooc.com/class/117.html 《Spring Cloud微服务实战》 http://coding.imooc.com/class/187.html 均已…