TS - 查看JVM状态

JStack

JStack是java虚拟机自带的一种堆栈跟踪工具,主要用来查看Java线程的调用堆栈的,可以用来分析线程问题(如死锁)。

命令帮助

$ 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)
    -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

分析线程问题(死锁查询)

jps -l             # 查看java进程的ID
top                # 查看系统中消耗cpu资源的进程排序
top -Hp <PID>      # 查看进程中比较消耗cpu的线程
printf %x <PID>    # 线程号转换为16进制
jstack -l <PID> |grep <16进制线程号>    # 查看指定线程堆栈信息

Jstat

jstat(Java Virtual Machine Statistics Monitoring Tool)是JDK自带的工具,位于java的bin目录下。
通过Jstat可以监控Java虚拟机的运行状态,显示Java虚拟机中的类加载、内存、垃圾收集、即时编译等运行状态的信息。

命令说明

$ java -version
java version "1.8.0_241"
Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode)

$ jstat -help
Usage: jstat -help|-options
       jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

Definitions:
  <option>      An option reported by the -options option
  <vmid>        Virtual Machine Identifier. A vmid takes the following form:
                     <lvmid>[@<hostname>[:<port>]]
                Where <lvmid> is the local vm identifier for the target
                Java virtual machine, typically a process id; <hostname> is
                the name of the host running the target Java virtual machine;
                and <port> is the port number for the rmiregistry on the
                target host. See the jvmstat documentation for a more complete
                description of the Virtual Machine Identifier.
  <lines>       Number of samples between header lines.
  <interval>    Sampling interval. The following forms are allowed:
                    <n>["ms"|"s"]
                Where <n> is an integer and the suffix specifies the units as
                milliseconds("ms") or seconds("s"). The default units are "ms".
  <count>       Number of samples to take before terminating.
  -J<flag>      Pass <flag> directly to the runtime system.

参数说明

option:      # 参数选项
-t:          # 可以在打印的列加上Timestamp列,用于显示系统运行的时间
-h:          # 可以在周期性数据输出的时候,指定输出多少行以后输出一次表头
vmid:        # Virtual Machine ID(进程的pid,可以通过jps命令获得)
interval:    # 执行每次的间隔时间,单位为毫秒
count:       # 用于指定输出多少次记录,缺省则会一直打印

# options 参数的选项
-class:               # 显示类加载、卸载数量、总空间和装载耗时的统计信息。
-compiler:            # 显示即时编译的方法、耗时等信息。
-gc:                  # 显示堆各个区域内存使用和垃圾回收的统计信息。
-gccapacity:          # 显示堆各个区域的容量及其对应的空间的统计信息。
-gcutil:              # 显示有关垃圾收集统计信息的摘要。
-gccause:             # 显示关于垃圾收集统计信息的摘要(与-gcutil相同),以及最近和当前垃圾回收的原因。
-gcnew:               # 显示新生代的垃圾回收统计信息。
-gcnewcapacity:       # 显示新生代的大小及其对应的空间的统计信息。
-gcold:                 #显示老年代和元空间的垃圾回收统计信息。
-gcoldcapacity:       # 显示老年代的大小统计信息。
-gcmetacapacity:      # 显示元空间的大小的统计信息。
-printcompilation:    # 显示即时编译方法的统计信息。

命令示例

## 统计JVM中加载的类的数量与大小
jstat -class <PID>  
# Loaded:       加载类的数量
# Bytes:       加载类的size,单位为Byte
# Unloaded:    卸载类的数目
# Bytes:       卸载类的size,单位为Byte
# Time:        加载与卸载类花费的时间

## 统计HotSpot中即时编译器编译情况
jstat -compiler
# Compiled:        编译任务执行数量
# Failed:          编译任务执行失败数量
# Invalid:         编译任务执行失效数量
# Time:            编译任务消耗时间
# FailedType:      最后一个编译失败任务的类型
# FailedMethod:    最后一个编译失败任务所在的类及方法

## 统计JVM中堆的垃圾收集情况
jstat -gc <PID> 
# S0C:     年轻代中第一个survivor(幸存区)的容量 (字节)
# S1C:     年轻代中第二个survivor(幸存区)的容量 (字节)
# S0U:     年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
# S1U:     年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
# EC:      年轻代中Eden(伊甸园)的容量 (字节)
# EU:      年轻代中Eden(伊甸园)目前已使用空间 (字节)
# OC:      Old代的容量 (字节)
# OU:      Old代目前已使用空间 (字节)
# MC:      metaspace(元空间)的容量 (字节)
# MU:      metaspace(元空间)目前已使用空间 (字节)
# CCSC:    当前压缩类空间的容量 (字节)
# CCSU:    当前压缩类空间目前已使用空间 (字节)
# YGC:     从应用程序启动到采样时年轻代中gc次数
# YGCT:    从应用程序启动到采样时年轻代中gc所用时间(s)
# FGC:     从应用程序启动到采样时old代(全gc)gc次数
# FGCT:    从应用程序启动到采样时old代(全gc)gc所用时间(s)
# GCT:     从应用程序启动到采样时gc用的总时间(s)

## 统计垃圾收集信息
jstat -gcutil <PID>
# S0:      年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
# S1:      年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
# E:       年轻代中Eden(伊甸园)已使用的占当前容量百分比
# O:       old代已使用的占当前容量百分比
# M:       元数据区已使用的占当前容量百分比
# CCS:     压缩类空间已使用的占当前容量百分比
# YGC:     从应用程序启动到采样时年轻代中gc次数
# YGCT:    从应用程序启动到采样时年轻代中gc所用时间(s)
# FGC:     从应用程序启动到采样时old代(全gc)gc次数
# FGCT:    从应用程序启动到采样时old代(全gc)gc所用时间(s)
# GCT:     从应用程序启动到采样时gc用的总时间(s)


## 显示垃圾回收的相关信息(通过-gcutil), 同时显示最后一次或当前正在发生的垃圾回收的诱因 
jstat -gccause <PID> 
# LGCC:    最后一次GC原因
# GCC:     当前GC原因(如果显示No GC,表明当前没有执行GC)

参考信息

posted @ 2024-07-24 22:29  Anliven  阅读(5)  评论(0编辑  收藏  举报