目录
jps命令 :
用于查看所有 Java进程
jps 显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一 ID
jps -l 输出主类的全名,如果进程执行的是 Jar 包,输出 Jar全名称
jps -v 输出虚拟机进程启动时 JVM参数
jstat命令 :
使用于监视虚拟机各种运行状态信息的命令行工具。 它可以显示本地或者远程(需要远程主机提供 RMI 支持)虚拟机进程中的类信息、内存、垃圾收集、JIT 编译等运行数据,在没有 GUI,只提供了纯文本控制台环境的服务器上,它将是运行期间定位虚拟机性能问题的首选工具。
jstat -class vmid 类加载统计
Loaded | 加载class的数量 |
Bytes | 所占用空间大小 |
Unloaded | 未加载数量 |
Bytes | 未加载占用空间 |
Time | 时间 |
jstat -gc vmid 垃圾回收统计
S0C | 新生代中第一个survivor(幸存区)的容量 (字节) |
S1C | 新生代中第二个survivor(幸存区)的容量 (字节) |
S0U | 新生代中第一个survivor(幸存区)目前已使用空间 (字节) |
S1U | 新生代中第二个survivor(幸存区)目前已使用空间 (字节) |
EC | 新生代中Eden区的容量 (字节) |
EU | 新生代中Eden区目前已使用空间 (字节) |
OC | 老年代的容量 (字节) |
OU | 老年代目前已使用空间 (字节) |
MC | metaspace(元空间)的容量 (字节) |
MU | metaspace(元空间)目前已使用空间 (字节) |
YGC | 从应用程序启动到采样时新生代中GC次数 |
YGCT | 从应用程序启动到采样时新生代中GC所用时间(s) |
FGC | 从应用程序启动到采样时Full GC的次数 |
FGCT | 从应用程序启动到采样时Full GC所用时间(s) |
GCT | 从应用程序启动到采样时GC用的总时间(s) |
jstat -gccapacity vmid 堆内存统计
NGCMN | 新生代(young)中初始化(最小)的大小(字节) |
NGCMX | 新生代(young)的最大容量(字节) |
NGC | 新生代(young)中当前的容量(字节) |
S0C | 新生代中第一个survivor(幸存区)的容量 (字节) |
S1C | 新生代中第二个survivor(幸存区)的容量(字节) |
EC | 新生代中Eden区的容量(字节) |
OGCMN | 老年代中初始化(最小)的大小(字节) |
OGCMX | 老年代的最大容量(字节) |
OGC | 老年代当前新生成的容量 (字节) |
OC | 老年代的容量(字节) |
MCMN | metaspace(元空间)中初始化(最小)的大小(字节) |
MCMX | metaspace(元空间)的最大容量(字节) |
MC | metaspace(元空间)当前新生成的容量(字节) |
CCSMN | 最小压缩类空间大小 |
CCSMX | 最大压缩类空间大小 |
CCSC | 当前压缩类空间大小 |
YGC | 从应用程序启动到采样时新生代中GC次数 |
FGC | 从应用程序启动到采样时Full GC次数 |
jstat -gcmetacapacity vmid 元空间统计
MCMN | 最小元数据容量 |
MCMX | 最大元数据容量 |
MC | 当前元数据空间大小 |
CCSMN | 最小压缩类空间大小 |
CCSMX | 最大压缩类空间大小 |
CCSC | 当前压缩类空间大小 |
YGC | 从应用程序启动到采样时新生代中GC次数 |
FGC | 从应用程序启动到采样时Full GC次数 |
FGCT | 从应用程序启动到采样时Full GC所用时间(s) |
GCT | 从应用程序启动到采样时GC用的总时间(s) |
jstat -gcnew vmid 新生代统计
S0C | 新生代中第一个survivor(幸存区)的容量 (字节) |
S1C | 新生代中第二个survivor(幸存区)的容量 (字节) |
S0U | 新生代中第一个survivor(幸存区)目前已使用空间 (字节) |
S1U | 新生代中第二个survivor(幸存区)目前已使用空间 (字节) |
TT | 持有次数限制 |
MTT | 最大持有次数限制 |
DSS | 期望的幸存区大小 |
EC | 新生代中Eden区的容量 (字节) |
EU | 新生代中Eden区目前已使用空间 (字节) |
YGC | 从应用程序启动到采样时新生代中GC次数 |
YGCT | 从应用程序启动到采样时Full GC所用时间(s) |
jstat -gcold vmid 老年代统计
MC | metaspace(元空间)的容量 (字节) |
MU | metaspace(元空间)目前已使用空间 (字节) |
CCSC | 压缩类空间大小 |
CCSU | 压缩类空间使用大小 |
OC | Old代的容量 (字节) |
OU | Old代目前已使用空间 (字节) |
YGC | 从应用程序启动到采样时新生代中GC次数 |
FGC | 从应用程序启动到采样时Full GC的次数 |
FGCT | 从应用程序启动到采样时Full GC所用时间(s) |
GCT | 从应用程序启动到采样时Full GC用的总时间(s) |
jstat -gcutil -vmid 老年代统计
S0 | 新生代中第一个survivor(幸存区)已使用的占当前容量百分比 |
S1 | 新生代中第二个survivor(幸存区)已使用的占当前容量百分比 |
E | 新生代中Eden(伊甸园)已使用的占当前容量百分比 |
O | old代已使用的占当前容量百分比 |
M | metaspace代已使用的占当前容量百分比 |
YGC | 从应用程序启动到采样时新生代中GC次数 |
YGCT | 从应用程序启动到采样时新生代中GC所用时间(s) |
FGC | 从应用程序启动到采样时Full GC的次数 |
FGCT | 从应用程序启动到采样时Full GC所用时间(s) |
GCT | 从应用程序启动到采样时GC用的总时间(s) |
jinfo命令:
Configuration Info for Java,显示JVM虚拟机各项参数
jinfo vmid 输出当前 jvm进程的全部参数和系统属性,第一部分是系统属性,第二部分是 JVM参数。
jinfo -flags vmid 输出全部JVM参数
jinfo -flag InitialHeapSize vmid 查看堆的初始容量
jinfo -flag PrintGC vmid 查看是否开启GC日志,如果没有打开,则输出:-XX:-PrintGC。使用+PrintGC开启
jstack命令:
用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合信息。生成线程快照的目的主要是定位线程长时间出现停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的原因。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者在等待些什么资源。
我们可以根据一个死锁案例 并结合这个命令来看
/**
* @author CC
* @version 1.0
* @since2023/9/15
*/
public class demo3 {
private static Object objLock1 = new Object(); // 对象锁1
private static Object objLock2 = new Object(); // 对象锁2
public static void main(String[] args) {
new Thread(() -> {
synchronized (objLock1) {
System.out.println(Thread.currentThread().getName() + "获取对象锁1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "等待获取对象锁2");
synchronized (objLock2) {
System.out.println(Thread.currentThread().getName() + "获取对象锁2");
}
}
}, "线程 1").start();
new Thread(() -> {
synchronized (objLock2) {
System.out.println(Thread.currentThread().getName() + "获取对象锁2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "等待获取对象锁1");
synchronized (objLock1) {
System.out.println(Thread.currentThread().getName() + "获取对象锁1");
}
}
}, "线程 2").start();
}
}
运行该案例
jstack vmid 用于生成虚拟机当前时刻的线程快照。
jconsole命令:
这个命令可以打开一个java提供的一个 java监视和管理的可视化工具
从Java 5开始 引入了 JConsole。JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行。您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )来监控 Java 应用程序性能和跟踪 Java 中的代码。
jvisualvm命令:
这个命令可以打开一个VisualVM可视化工具
VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优。这些功能包括生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和 CPU 分析,同时,它能自动选择更快更轻量级的技术尽量减少性能分析对应用程序造成的影响,提高性能分析的精度。