Java定位问题线程解析
作者:思想永无止境 发布时间:2023-08-09 22:04:27
前言
ps
命令的作用是显示进程信息的。|
符号,是个管道符号,表示左右两边两个命令同时执行。grep
命令是查找(Global Regular Expression Print),能使用正则表达式搜索文本,然后把匹配的行显示出来。
命令参数如果前面的参数没有输入值,那么可以多个合并在一起,如-mp等同于-m -p。
grep -A -B -C 属于上下文控制(Context control),使用规则如下:
grep -A 显示匹配指定内容及之后的n行
grep -B 显示匹配指定内容及之前的n行
grep -C 显示匹配指定内容及其前后各n行
查看是哪个进程占用了CPU
通过top命令,查看CPU使用率高的进程,看看COMMAND是不是java。
查看这个进程号对应的是哪个java程序
此步骤主要是在服务器部署多个java程序时,查看进程具体的包名,如果服务器只部署了一个jar可以忽略此步骤。
方案1
使用jps显示所有的java应用程序
jps -l
方案2
使用ps|grep搜索所有的java应用程序
ps -ef|grep java
查看这个进程中哪个线程占用了CPU 方案1,使用pidstat查看线程CPU占用率
pidstat -t -p pid
通过top获取的pid,使用pidstat -t -p pid查询进程下的线程。
方案3
使用ps查看线程CPU使用时长
ps -mp pid -o THREAD,tid,time
参数含义:
-m
显示所有的线程-p pid
进程使用cpu的时间-o
该参数后是用户自定义格式
将这个线程号转16进制(如果是java程序)
将CPU占有率高或CPU使用时间长的线程号转换为16进制(因为后面的jstack里的线程号是16进制),并且将其中的字母转成小写字母。
System.out.println(Integer.toHexString(10003999).toLowerCase());
在jstack中找到这个线程的堆栈信息
使用jstack [进程号] 打印当前的进程堆栈;
jstack 39836
返回值说明:
prio
,表示线程优先级,就是Thread中定义的线程优先级。os_prio
,表示线程在操作系统的优先级。tid
,表示Java内的线程ID,同样在Thread类中。nid
,表示线程在操作系统的线程ID,16进制,我们要的就是这个。
从打印的信息中,找到之前拿到的线程号
看看这个线程在做什么
jstack 39836 | grep tid -A60 #tid为小写的16进制线程ID
可以将CPU占有率高的线程都看一下。
jstack打印的信息可以多关注:Java stack information for the threads listed above:,如果有发现Found 1 deadlock就是死锁导致的。
来源:https://blog.csdn.net/u012643122/article/details/126277283


猜你喜欢
- 最近在看 C++ 的方法重载,我就在想 C# 中的重载底层是怎么玩的,很多朋友应该知道 C 是不支持重载的,比如下面的代码就会报错。#inc
- ps:我用的版本是7.0.5场景:左侧第一列宽度不够,导致数据换行。Table table = new Table(new float[2]
- 生成excel并导出到对应位置package tech.BurtonPratice; import org.apache.poi.hssf.
- 本文实例讲述了C#实现文件断点续传下载的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.D
- 访问控制:private 私有的protected 受保护的public 公共的类、方法和变量修饰符abstract 声明抽象class 类
- 重写 equals()方法 和 hashCode()方法最近看了学习了集合的简单的知识,碰到了讲解 Set 的部分,感觉很好奇,这里对于 S
- 最近正式入坑Flutter,首先从环境搭建开始,看了网上好多关于Windows环境搭建的资料,基本都是按官方文档写的,看完的感受是,还不如直
- 前言上篇博客我们介绍了如何创建一个spring项目,并且如何的存、取对象,介绍了相关方法,那么本篇博客将接着上篇博客的内容介绍如何更加简单的
- IOC创建对象的方式一、 使用无参构造创建对象(默认方式)创建实体类注意:属性必须要有set方法,来完成注入public class Use
- 命名空间提供了一种从逻辑上组织类的方式,防止命名冲突。几种常见语言C++命名空间是可以嵌套的嵌套的命名空间是指定义在其他命名空间中的命名空间
- 很多小伙伴刚刚接触.net这一平台,可能不清楚如何安装最新版本VS 来搭建一个好用的编译器;本文将引导大家安装VS2019 C#语言的安装第
- 本文实例为大家分享了Android实现缓存大图到SD卡的具体代码,供大家参考,具体内容如下该功能主要针对资源图片过大占用apk体积,所以先将
- Mybatis Criteria条件查询CriterionCriterion是最基本,最底层的Where条件,用于字段级的筛选。Criter
- 一、简介随着 Apple 发布 iPhone X 之后,各大手机厂商也开始模仿这种刘海屏的设计,而且刘海屏手机的用户也是越来越大,前段时间将
- 在两个Activity跳转时,由于第二个Activity在启动时加载了较多数据,就会在启动之前出现一个短暂的黑屏时间,解决这个
- Spring MVC 启动的关键流程我们已经学习了 Handler 与 HandlerMapping,还未掌握的小伙伴可以翻看前面的文章进行
- 昨天晚上写代码的时候偶然发现 DateTime 里出现了星期几,当时一阵凌乱,去网上百度没有详细解决办法,很多人说可以用用 ToString
- 利用源码编译Android系统Java类库1、编写Java项目和Android.mk文件 ├── Android.mk &nbs
- Android 自定义返回按钮的实例详解程序中我们有时候想让放回按钮按照自己的需求调整页面而不是单纯的按照系统返回上一级,这个问题很简单,重
- 本文实例讲述了C#多线程之Thread中Thread.Join()函数用法。分享给大家供大家参考。具体分析如下:Thread.Join()在