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)
参考信息
- JVM内存回收机制: https://www.cnblogs.com/fefjay/p/6297340.html
- JVM 虚拟机入门教程:https://www.cnblogs.com/chanshuyi/category/1335567.html
- Jstack命令详解: https://www.cnblogs.com/myseries/p/12050083.html
- Jstat文档:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html
- 用jvisualvm分析dump文件: https://blog.csdn.net/lkforce/article/details/60878295
行动是绝望的解药!
欢迎转载和引用,但请在明显处保留原文链接和原作者信息!
本博客内容多为个人工作与学习的记录,少数内容来自于网络并略有修改,已尽力标明原文链接和转载说明。如有冒犯,即刻删除!
以所舍,求所得,有所获,方所成。