jatack命令简介

jstack 命令是JDK工具之一,使用该命令可以打印正在运行中 Java 进程的栈信息。

1. 帮助文档

[root@jiangnan ~]# jstack --help
Usage:jstack [-l] <pid>(to connect to running process)jstack -F [-m] [-l] <pid>(to connect to a hung process)jstack [-m] [-l] <executable> <core>(to connect to a core file)jstack [-m] [-l] [server_id@]<remote server IP or hostname>(to connect to a remote debug server)Options:-F  to force a thread dump. Use when jstack <pid> does not respond (process is hung)(强制打印线程栈信息,在jstack <pid>命令没有响应的时候添加该选项可以实现强制打印)-m  to print both java and native frames (mixed mode)((mix)混合模式,可以打印 Java 栈和本地方法栈)-l  long listing. Prints additional information about locks((long listing)长列表模式. 额外打印关于锁的信息)-h or -help to print this help message
[root@jiangnan ~]#

2. jstack用法

首先使用 jps命令查看需要打印线程栈的java进程号。

[sams@sams-app-app-7758c59fcd-dh84t ~]$ jps
82 ASMain
17037 Jps
[sams@sams-app-app-7758c59fcd-dh84t ~]

我们这里链接到 82 这个进程号上,使用下面命令:

[sams@sams-app-app-7758c59fcd-dh84t ~]$ jstack 82
2022-85-08 13:49:28
Full thread dump OpenJDK 64-Bit Server VM (25.265-B01 mixed mode):"Attach Listener" #243 daemon prio=9 os_ prio=8 tid-8x00087f688001888 nid=8x1e8 waiting on condition [8x8088888088888 ] java.lang.Thread.State: RUNNABLE"WG- TxProcessor-worker-2" #241 daemon prio=5 os_ prio=8 tid-0x88887f6ddc88b088 nid=8x1e6 waiting on condition [8x88887f6d26fc5088]
java.lang.Thread.State: WAITING (parking)
at sun.misc Unsafe·park(Native Method)- parking to wait for <x0808087236d4d50 (a java.util.concurrent.locks.AbstractQueuedSynchronizer$Conditionbc
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)at java. util. concurrent.locks.AbstractQueuedSynchronizer$Condition . await(AbstractQueuedSynchone.java: 2839) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue. java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1874)
at java.util.concurrent.ThreadPoolExecutor.runlorker(ThreadPoolExecuto.java:1134)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java 624)
at java.lang.Thread.run(Thread.java:748)

可以看到控制台打印出了线程的信息以及线程对应的堆栈信息。

java.lang.Thread.State: RUNNABLE 线程状态

我们通过 jstack查看线程栈信息时通常看到的最多的是RUNNABLE,BLOCKED,WAITINGTIMED_WAITING这几种状态,我们一般看不到线程的NEWTERMINATED状态,是因为在代码的运行过程中这两种状态只占很小一部分,我们捕捉到这两种状态前这两种状态已经一闪而过了。

#241 表示当前线程ID,从 main线程开始,JVM 根据线程创建的顺序为线程编号。

prio 是priority优先级的缩写,表名了当前线程的优先级,取值范围为[1-10],默认为 5。在虚拟机进行线程调度的时候会参考该优先级为线程分配计算资源,这个数值越低越有优先获取到计算资源,一般不设置直接使用默认的优先级。
os_prio为线程对应系统的优先级。
nid 本地线程编号NativeID的缩写,对应JVM 虚拟机中线程映射在操作系统(本地)中的线程编号。我们可以使用 top 查看进程对应的线程情况进行相关映射。

3. jstacktop -Hp <pid>

使用 jstacktop -Hp <pid>查看进程详细信息获取目标线程的CPU使用情况

通过 jstack 可以打印出当前进程的线程栈信息,但是我们无法获取到这些线栈的 CPU 占用情况,此时,我们可以使用另外一个bash命令 top 去排查高 CPU 占用的线程。

可以看到82的进程使用CPU较大

然后使用 top -Hp <pid>查看该进程下对应线程的CPU 使用情况:

top -Hp 82

我们看到410线程占用CPU较大,这时我们通过jstack查看详情。

首先将410转换为16进制。

然后使用jstack 82| grep -10 19a

发现是prometheus的中间件占用CPU较大。

4. ps -Lf <pid>

使用 ps -Lf <pid>查看进程详细信息

PID:进程号
LWP:线程号

微信公众号先已开通,搜索 “江小南和他的小伙伴们” 就能找到我哦,各位小伙伴们可以关注一下,文章会进行同步更新,方便查看哦。

【Linux篇】jstack命令简介相关推荐

  1. Linux篇之命令行下载远程文件curl命令的介绍与使用

    一.curl简介 通常情况下,当我们不想在本机下载文件,上传至服务器时,觉得这样过于麻烦,步骤繁琐. 那么该怎么办呢? 在Linux中,服务器下载文件,提供了一种curl命令,它可以实现在Linux中 ...

  2. linux shell find 命令简介

    find命令格式: find   path  -option  [ -print ]  [ -exec   -ok   |xargs  |grep  ] [  command  {} \;  ] fi ...

  3. linux shell install 命令简介

    用法:install [选项]... [-T] 源文件 目标文件 或:install [选项]... 源文件... 目录 或:install [选项]... -t 目录 源文件... 或:instal ...

  4. Linux下tar命令简介

    总结一下Linux中tar命令的用法. tar命令的参数: 这五个参数是独立的和别的命令连用时只能使用其中一个. -c: 创建一个打包文件(create) -x:解压 -t:查看内容 -r:向压缩归档 ...

  5. linux中jstack命令详解,Linux jstack命令详解

    jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息. 如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack ...

  6. linux strip作用,linux gcc strip命令简介

    阅读目录 strip简介 strip经常用来去除目标文件中的一些符号表.调试符号表信息,以减小静态库.动态库和程序的大小. strip支持的选项可通过如下命令查看: strip --help stri ...

  7. linux gcc strip命令简介

    阅读目录 strip简介 strip示例 strip命令用法 程序开发是否要strip 静态库如何strip 参考资料 strip简介 strip经常用来去除目标文件中的一些符号表.调试符号表信息,以 ...

  8. linux sort 排序命令简介

    语法 sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][ ...

  9. Linux的mount命令简介

    在Linux系统中,如果要使用硬盘.光盘.软盘或MO盘等存储设备,必须先进行挂装(Mount).当存储设备挂装完成之后,就可以将其作为一个目录来进行访问了.挂装设备需要使用mount命令.执行这一命令 ...

最新文章

  1. Zookeeper源码编译为Eclipse工程(转)
  2. java 反查域名_C段查询雏形之在Java中反查一个IP上的所有域名(旁站查询)
  3. Oracle AWR 介绍
  4. linux 中阻塞与非阻塞 同步与异步
  5. 清空网站浏览记录就行啦?看Python如何实时监控网站浏览记录
  6. 几个提升Go业务开发效率的流行框架和开源库
  7. ibatis调用mysql带OUT类型参数的存储过程并获取返回值
  8. mockwebserver java_在Java中使用WireMock和SOAP Web服务
  9. Linux设备驱动模型一 sysfs
  10. excel 查一列字符是否在另一列中出现
  11. 数据分析sql面试必会6题经典_经典SQL面试题及答案分析
  12. 经济管理学中常用的模型分析法
  13. 计算机信息安全认识实习报告
  14. scrapy爬虫实战
  15. linux根windows,linux系统刨根之路(二):实现windows和linux双系统-Go语言中文社区...
  16. 硬件设备使用网线连接PC并访问外网
  17. 微博封禁117个百万大V账号!
  18. 内容权限判断帝国cms教程
  19. CA认证的原理和流程以及https完整通信过程
  20. Verilog基础语法--运算符【常用的几种】

热门文章

  1. 当今世界十大经典算法
  2. Docker 容器化部署
  3. Linux彻底卸载删除Mysql和安装mysql
  4. SpringCloud(8)—— 国寿i动项目经验之(拦截器Interceptors技术)
  5. spring配置文件ApplicationContext.xml里面class等没有提示功能
  6. web前端开发都用什么软件?
  7. 如何将两张图片上下拼接?
  8. flutter父组件调用子组件方法
  9. iphone android 功能清单,让iPhone羡慕:Android N最赞10大新功能
  10. VS2019,C++,内存检测泄漏工具VLD(Visual Leak Detector)的使用