JVM常用监控工具(3)-jstack

用途说明

jstack 是 JDK 自带的一个工具,用于生成 Java 进程的线程快照(也称为堆栈跟踪)。它可以用于诊断 Java 应用程序中的线程问题,比如死锁、线程阻塞等。下面是 jstack 的基本使用方法:

命令参数

bash 复制代码
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)
    -m  to print both java and native frames (mixed mode)
    -l  long listing. Prints additional information about locks
    -h or -help to print this help message

通常用法

bash 复制代码
jstack <pid> > thread_dump.txt

-F 参数代表强制执行

-m 生成带有本地变量和锁信息的线程快照。使用 -m 参数可能会增加线程快照的大小,并稍微增加生成线程快照的时间,但通常这种额外的信息对于定位问题非常有帮助。

线程状态

jstack 输出的线程快照中,线程状态通常以如下几种形式展示:

  1. RUNNABLE(运行状态):表示线程正在 JVM 中执行 Java 代码,或者是等待操作系统调度执行。

  2. BLOCKED(阻塞状态) :表示线程被阻塞,通常是由于它试图获取一个对象的监视器锁(synchronized 代码块或方法)而被其他线程持有该锁,也可能是由于调用了 Object.wait() 方法而进入了等待状态。

  3. WAITING(等待状态) :表示线程正在等待某个条件的发生,如等待另一个线程的通知,或者等待某个条件的满足而进入休眠状态。常见于调用 Object.wait()Thread.join()LockSupport.park() 等方法时。

  4. TIMED_WAITING(计时等待状态) :类似于 WAITING 状态,但是在等待期间指定了超时时间。常见于调用带有超时参数的 Object.wait()Thread.sleep()Thread.join() 等方法时。

  5. TERMINATED(终止状态):表示线程已经执行完成,不再执行任何代码。

通常,我们需要重点关注**BLOCKED(阻塞状态),WAITING(等待状态)的线程,**再结合具体的代码以及业务场景来分析问题。

后面笔者准备出一期实战案例来详细分析排查jvm出现的问题,敬请期待

相关推荐
helloworldandy7 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
m0_7155753410 小时前
使用PyTorch构建你的第一个神经网络
jvm·数据库·python
Word码11 小时前
[C++语法] 继承 (用法详解)
java·jvm·c++
野犬寒鸦12 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
符哥200817 小时前
C++ 进阶知识点整理
java·开发语言·jvm
夕除18 小时前
js--15
java·jvm·spring
4311媒体网20 小时前
C语言操作符全解析 C语言操作符详解
java·c语言·jvm
猫头虎1 天前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
wgslucky1 天前
jdk17 配置jvm参数中gc的日志及控制日志数量和大小
jvm·gc·-xlog
痴儿哈哈1 天前
自动化机器学习(AutoML)库TPOT使用指南
jvm·数据库·python