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出现的问题,敬请期待

相关推荐
程序猿202311 小时前
MAT(memory analyzer tool)主要功能
jvm
期待のcode14 小时前
Java虚拟机的非堆内存
java·开发语言·jvm
jmxwzy17 小时前
JVM(java虚拟机)
jvm
Maỿbe18 小时前
JVM中的类加载&&Minor GC与Full GC
jvm
人道领域19 小时前
【零基础学java】(等待唤醒机制,线程池补充)
java·开发语言·jvm
小突突突19 小时前
浅谈JVM
jvm
饺子大魔王的男人20 小时前
远程调试总碰壁?局域网成 “绊脚石”?Remote JVM Debug与cpolar的合作让效率飙升
网络·jvm
天“码”行空1 天前
java面向对象的三大特性之一多态
java·开发语言·jvm
独自破碎E1 天前
JVM的内存区域是怎么划分的?
jvm
期待のcode2 天前
认识Java虚拟机
java·开发语言·jvm