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

Java定位问题线程解析

方案2

使用ps|grep搜索所有的java应用程序

ps -ef|grep java

查看这个进程中哪个线程占用了CPU 方案1,使用pidstat查看线程CPU占用率

pidstat -t -p pid

通过top获取的pid,使用pidstat -t -p pid查询进程下的线程。

Java定位问题线程解析

方案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

Java定位问题线程解析

返回值说明:

  • 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

标签:Java,定位,线程
0
投稿

猜你喜欢

  • 一文带你初识java中的String类

    2022-05-20 10:36:53
  • C#设置页面单位和缩放的方法

    2023-06-09 12:59:27
  • android通过拼音搜索中文的功能实现代码

    2022-03-12 04:48:17
  • Java Servlet简单实例分享(文件上传下载demo)

    2022-03-03 06:35:04
  • mybatis 运行时加载自定义mapper文件方式

    2023-08-16 10:00:16
  • JFinal使用ajaxfileupload实现图片上传及预览

    2023-08-05 08:30:48
  • 图解Windows环境下Android Studio安装和使用教程

    2023-11-27 05:44:32
  • 用命令行编译java并生成可执行的jar包方法

    2023-01-15 23:21:35
  • Java IO学习之缓冲输入流(BufferedInputStream)

    2021-10-08 22:30:23
  • C# 动态调用WebService的示例

    2023-07-04 05:40:20
  • Android实现图像切换器

    2023-11-27 00:45:41
  • AndroidStudio 实现加载字体资源的方法

    2023-06-24 06:18:11
  • 浅谈Java内存区域与对象创建过程

    2022-08-31 17:56:25
  • c#通过unicode编码判断字符是否为中文示例分享

    2022-01-13 16:33:44
  • Spring Security OAuth 自定义授权方式实现手机验证码

    2021-10-03 23:30:27
  • SpringBoot配置actuator的代码

    2023-02-04 04:45:06
  • Java基础-Java的体系结构

    2022-05-18 00:19:05
  • Java中的break和continue关键字的使用方法总结

    2022-07-13 11:50:46
  • 使用IDEA开发配置Java Web的初始化过程

    2022-09-25 16:33:38
  • WPF仿LiveCharts实现饼图的绘制

    2022-02-08 02:17:05
  • asp之家 软件编程 m.aspxhome.com