timed_waiting线程是否占用cpu_程序CPU占用率飙升,如何定位线程的堆栈信息?超详细,值得收藏看不懂还有配套视频 第319篇...

关历史文章(阅读本文前,您可能需要先看下之前的系列?)

国内最全的Spring Boot系列之三

2020上半年发文汇总「值得收藏」

GraphQL的探索之路 – SpringBoot集成GraphQL小栗子篇二 - 第315篇

GraphQL的探索之路 – SpringBoot集成GraphQL之Query篇三 - 第316篇

GraphQL的探索之路 – SpringBoot集成GraphQL之Mutation篇四 - 第317篇

RocketMQ安装Linux/Mac/Window - 第318篇

需求缘起

在群里有这么一段对话:

愿得一人心:服务器cpu load偏高,无从下手,哪位大佬能提供点儿帮助

不老神话:top 查看偏高的进程

老鼠爱上猫:百度谷歌啊  查问题也是程序员必备技能之一

莫欺少年穷:要相信你肯定不是第一个遇到这个问题的

愿得一人心:查了,不顶用。

       问问题真的把问题说清楚,不然解答的人也是一脸懵逼,很多人都是愿意解答问题的,但是问问题的人问的模棱两可,导致没有人敢解答。

正文开始      

悟纤:师傅,师傅,紧急求助。

52322987efd58845fe606b7911d3f12a.gif

师傅:徒儿,何事如此之着急?

悟纤:我发现我写的代码导致CPU持续为99%,但是项目路这么大,我也不知道是哪块代码导致的。

师傅:徒儿,那你得看看是哪个线程里的逻辑导致了CPU飙高。

悟纤:那我们怎么找到这个线程在运行的堆栈信息呐?

师傅:jstack呀,你难道没有听过嘛?

悟纤:知道到知道这个指令,但是查看了些资料,都是说的不清楚,看完我也是一塌糊涂呐。

师傅:看来得为师给你好好讲讲了。

悟纤:还是喜欢师傅的讲解方式,简单、详细、一语道破天机

37639fde8052d687ea35d3d5760ecd61.gif

一、排查步骤

师傅:要找回线程的堆栈信息,主要是利用java给我们提供的调优工具jstack,我们看下具体的一个步骤:

(1)使用命令top -p ,显示你的java进程的cpu情况,pid是你的java进程号,比如14203。(使用jps可以获取到java的进程id 或者top直接查看)

(2)按H,获取每个线程的CPU情况。(shirt+H)

(3)找到内存和cpu占用最高的线程tid,比如14204。

(4)转为十六进制得到 377C ,此为线程id的十六进制表示。

(5)执行 jstack |grep -A 10 ,得到线程堆栈信息中1371这个线程所在行的后面10行。(注意:如果十六进制由字母的要小写)

# Jstack 14203 |  grep -A 10 377c

(6)查看对应的堆栈信息找出可能存在问题的代码。

师傅:看起来是不是很复杂,描述的罗里吧嗦的。

悟纤:看着就晕头转向的。

师傅:一句话概述。

一句话:通过top找到线程id,通过jstack找到线程的堆栈信息。

二、小试牛刀:Linux环境

2.1 准备工作

       我们编写一个小代码EndlessLoopTest用于模拟导致cpu过高(源码在最后提供),编译成class文件,将我们的class文件放到Linux上。

       注意:存放的需要根据包名建立目录结构,否则无法运行此class文件。

比如包名是com.kfit.jvm那么就需要创建一个目录结构com/kfit/jvm,然后把EndlessLoopTest.class放到这里面。

执行class:

java com.kfit.jvm.EndlessLoopTest

2.2 排查实战

2.2.1 使用top找到cpu飙高的java进程ID

       首先我们需要找到java进程ID,使用top指令:

#top

a4b33d97891c1c6b2b9965e402ac8163.png

       我们一看就看到了pid为14203的java的CPU使用率是99.7%并且持续飙高,那么这个肯定是代码写的有问题了。

2.2.2 使用top -p 显示进程情况

       我们使用如下命名查看java进程的情况:

#top -p 14203

1e7a4e64f69d2fa878547b56ead75ea1.png

       通过-p的方法就是只显示了指定进程的信息。

2.2.3 按H查看线程的CPU情况

       在上面的界面中使用shirt+H进行查看各个线程的CPU情况:

ae41e5f10166006eec5f4fed5dc7d2f2.png

       注意这里的PID实际对应的是线程的十进制的tid,通过上面我们可以看到CPU使用很高的线程ID是14204。

2.2.4 线程十进制转换为十六进制

       我们将获取到的线程十进制的转换为十六进制:

14204(十进制) = 377C(十六进制)

       怎么转你不知道嘛?

方式一:找个转换网站

https://tool.oschina.net/hexconvert/

https://tool.lu/hexconvert/(这个强大,可以一下子转换出来好几个进制的)

方式二:Linux/Mac的printf

       使用Linux/Mac的printf即可:

printf %x 14204  && echo

7c7c0560c7ddf8b3e01f9d69767d7696.png

方式三:Linux/Mac的echo

       Echo也是很强大的:

echo 'ibase=10;obase=16;14204'|bc

方式四:python的hex

       利用python的转换hex将十进制转换为十六进制:

d193cab96c757509ba769a9d8f0b8fc1.png

悟纤:师傅,你这是要飘了,要跑题了

556ec093fb812add815c33837e368d9e.png

师傅:哈哈,师傅这是已经超神了。

34b88e108349fb31c3336dc472ba060c.gif

2.2.5 执行jstack得到线程的堆栈信息

执行 jstack | grep -A 10 ,得到线程堆栈信息:

#jstack 14203 |  grep -A 10 377c

注意:小c、小c、小c,重要的事情说3遍。

6b41c214a4dcb195d27f5b17fcef6636.png

2.2.6查看对应的堆栈信息问题排查

       我上面的堆栈信息可以看出出现问题的类是EndlessLoopTest.java,代码行号是13:

a0d6bdc5590264c0fd4583778435fb13.png

源码:

package com.kfit.jvm;import java.net.Socket;/** * 死循环测试 */public class EndlessLoopTest {    public void test(){        int random = (int) (java.lang.Math.random() * 1000);        while (random < 100) {            random = random * 10;        }        System.out.println(random);    }    public static void main(String[] args) {        EndlessLoopTest test = new EndlessLoopTest();        for(int i=0;i<5000;i++){            test.test();        }    }}

       我们分析这个while循环,看着挺正常的,但是如果当random为0的时候,不就是陷入死循环了吗。

悟纤小结

悟纤:师傅,你真是我的偶像,讲解的如此之详细,我要是再不懂,看来只能退出编程界了。

师傅:徒儿,言重了。虽然为师已经介绍的很详细了,但是难免在实际使用的时候会踩到一些坑。

悟纤:那为了避免大家采坑,我和大家总结下。

核心就是两大步骤:

(1)通过top找到线程id。

通过Linux系统的top命名找到cpu飙高的进程id;通过top -p 找到该进程id的cpu信息;然后配合shirt+H命名,就可以找到CPU线程高的线程ID:通过工具类将十进制的线程id转换为十六进制的。

(2)通过jstack找到线程的堆栈信息。

       通过jstack | grep -A 10 就可以找到线程的堆栈信息。

通过top找到线程id,通过jstack找到线程的堆栈信息。

我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。

à悟空学院:https://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/A6ZagYTi

Spring Cloud视频:http://t.cn/A6ZagxSR

SpringBoot Shiro视频:http://t.cn/A6Zag7IV

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringData和JPA视频:http://t.cn/A6Zad1OH

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

Sharding-JDBC分库分表实战:

http://t.cn/A6ZarrqS

分布式事务解决方案「手写代码」:

http://t.cn/A6ZaBnIr

深入理解JVM内存模型/调优实战:

http://t.cn/A6wWMVqG

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

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

相关文章

sql多层嵌套别名无效_SQL之复杂查询

前文学了汇总分析&#xff0c;学了常见的汇总函数&#xff0c;会分组并且掌握了对分组结果指定条件。今天开始学习SQL的视图和子查询&#xff0c;还有数据库关联与嵌套查询内容的学习。一、视图1.1视图是有单固定存储可反复读取使用的子查询&#xff0c;所以视图适用于频繁使用…

POJ 1195 Mobile phones【 二维树状数组 】

题意&#xff1a;基础的二维数组&#xff0c;注意 0 lowbit(0)会陷入无限循环----- 之前做一道一维的一直tle,就是因为这个-------------------------- 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #includ…

基于Angularjs实现分页

前言 学习任何一门语言前肯定是有业务需求来驱动你去学习它&#xff0c;当然ng也不例外&#xff0c;在学习ng前我第一个想做的demo就是基于ng实现分页&#xff0c;除去基本的计算思路外就是使用指令封装成一个插件&#xff0c;在需要分页的列表页面内直接引用。 插件 在封装分页…

mbot机器人初体验_[首发开箱]Makeblock mBot Ranger mBot游侠版 强大的STEM教育机器人...

本帖最后由 ahagowo 于 2016-4-17 08:38 编辑mBot游侠机器人套件是一个三种功能于一身的STEM教育机器人套件&#xff0c;它支持3种组装形态&#xff1a;机器人坦克&#xff0c;三轮赛车&#xff0c;和自平衡车。mBot游侠可通过 iPad&#xff0c;平板计算机或笔记本计算机来编程…

python课程笔记_Python课程笔记(一)

由于新冠状病毒的爆发&#xff0c;不得不在家里上网课&#xff0c;开课已经两个礼拜了&#xff0c;今天上完Python课后&#xff0c;准备整理一下最近学习Python的笔记。人生苦短&#xff0c;我用Python一、Hello World初学一门新的语言&#xff0c;就一定要从Hello World开始pr…

redis的lrange_thinkphp5操作redis系列教程】列表类型之lRange,lGetRange

namespace app\admin\controller;use think\cache\driver\Redis;use think\Controller;use \think\Db;class Index extends Controller{//获取redispublic function getRedis(){$redis new \Redis();$redis->connect(127.0.0.1,6379);$redis->auth(root); //redis密码ec…

云服务器建站原理_云服务器cvm与建站主机之间的区别

(文章来源&#xff1a;西部数码)云服务器cvm与建站主机区别是什么&#xff1f;cvm的英文全拼是CloudVirtualMachine(云虚拟机)&#xff0c;所以云服务器cvm是指虚拟云服务器&#xff0c;属于云服务器产品中的一种。而建站主机一般多是指虚拟主机&#xff0c;是在服务器中划分出…

maven找到mysql 连接池_在Tomcat6.0+MySQL5.0环境下配置和使用数据库连接池

一&#xff0c;在Tomcat中配置连接池的JNDI首先到MySQL的网站上下载MySQL JDBC连接器放到%CATALINA_HOME%/lib目录下&#xff0c;在%CATALINA_HOME%/conf目录下找到context.xml&#xff0c;这个文件是全局的&#xff0c;如果想只对特定的应用使用可以编辑WEB-INF/context.xml文…

mysql将多个成绩放在一排_mysql巧用连表查询各科成绩前三名

下列是各表的详情&#xff0c;不想自己建表的同学可以直接copy code&#xff0c;数据随意。创建表成绩详情表&#xff1a;CREATE TABLE score (id int(10) NOT NULL AUTO_INCREMENT,subject_id int(10) DEFAULT NULL,student_id int(10) DEFAULT NULL,score float DEFAULT NULL…

LeetCode Contains Duplicate (判断重复元素)

题意&#xff1a; 如果所给序列的元素不是唯一的&#xff0c;则返回true&#xff0c;否则false。 思路&#xff1a; 哈希map解决。 1 class Solution {2 public:3 bool containsDuplicate(vector<int>& nums) {4 unordered_map<int,int> mapp;5 …

提高团队代码质量

近期看到一篇博客。大致的意思就是网管将原本混乱不堪的交换机整理整齐了&#xff0c;起初交换机是图2那样的&#xff0c;由于越来用的人越多&#xff0c;操作的人越来越多。终于成为了图1那个样子。这不禁让我想到了项目中的代码。原先在刚上线的时候谈不上是完美的&#xff0…

webrender 查看是否开启_想要体验极致顺滑的网页加载体验?手动开启Firefox WebRender渲染引擎...

昨天我们提到火狐浏览器最新稳定版Mozilla Firefox v67 版将面向部分用户开启WebRender渲染引擎测试。据火狐浏览器团队介绍当用户开启新的渲染引擎后 , 网页加载帧率能够从现有的 20FPS 直接提升到 60FPS。不过新的渲染引擎本身并不是用于加快网页的加载速度&#xff0c;而是…

NOIP201307货车运输

试题描述A 国有n座城市&#xff0c;编号从1到n&#xff0c;城市之间有m条双向道路。每一条道路对车辆都有重量限制&#xff0c;简称限重。现在有q辆货车在运输货物&#xff0c;司机们想知道每辆车在不超过车辆限重的情况下&#xff0c;最多能运多重的货物。输入第一行有两个用一…

knime如何连接mysql_knime怎么连接MySQL?

首先判断一下网络是否通&#xff1a;如果在局域网相同网段内那网络是通的&#xff0c;不同网段间需要看是否有做隔离&#xff0c;如果没有隔离&#xff0c;那就也是通的。测试方法可以用telnet 数据库IP 数据库端口号的方式探测一下 例如 telnet 192.168. 1.124 3306创建用户&a…

Asp.net Vnext IValueProvider

概述 本文已经同步到《Asp.net Vnext 系列教程 》中] IValueProvider 根据ValueProvider获取数据&#xff0c;在对数据进行绑定 代码实现 private class CustomValueProvider : IValueProvider{//判断否具有指定的前缀public Task<bool> ContainsPrefixAsync(string pref…

ECNUOJ 2615 会议安排

会议安排 Time Limit:1000MS Memory Limit:65536KBTotal Submit:451 Accepted:102 Description 科研人员与相关领域的国内外同行进行适时的接触与充分的交流&#xff0c;对于促进提高他们的科研业务水平&#xff0c;并及时掌握科研动态是十分必要而且重要的。ECNU为了走在科技…

拼团php开发逻辑思维罗振宇_2019罗胖罗振宇跨年演讲手动整理稿,看了两遍

2019罗胖罗振宇跨年演讲看了两遍&#xff0c;手动整理文档1.岁月不饶人&#xff0c;我们也没饶了岁月2.你有你的计划&#xff0c;原来这个世界另有计划&#xff0c;既然这个世界另有计划&#xff0c;我们就得重做计划3.做事的人和不做事的人4.宏观是我们必须忍受的&#xff0c;…

今夜的硬件之旅

6脚继电器&#xff1a; 汇科继电器HK4100F-DC6V-SHG ①3A触点切换能力 ②具有一组常开&#xff0c;一组转换触点形式 ③超小型&#xff0c;标准印刷制版引出脚 ④有塑封型 Outline&#xff08;L*W*H&#xff09;外形尺寸&#xff1a;15.510.511.8 Contact Date触电形式&#…

mp3 pcm java_Java mp3文件转pcm文件

Java mp3文件转pcm文件package cn.zpy.util;import java.io.File;import java.io.IOException;import javax.sound.sampled.AudioFileFormat;import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioInputStream;import javax.sound.sampled.AudioSystem;imp…

Material design 色彩

八月已过去&#xff0c;九月刚来到~暑假已过去~九月上学季~~又迎来了一个桂花飘香的季节&#xff0c;你是否有了新的目标和计划~~所以在九月初始给大家带来一个全新的东西&#xff08;ps&#xff1a;对于我来说是全新的东西&#xff09;——Material Design~~九月让我们一起好好…