在JVM在运行的过程中,如果可以跟踪系统的运行状态,那么对于问题的故障排查会有一定的帮助,为此,JVM提供了一些列的命令来帮我我们进行JVM监控或故障排查。
Oracle官方文档已给出具体说明:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/index.html 下面我们来尝试使用一下。
JVM监控
jps
这个命令是Java HotSpot VMs预装的插件,通常我们可以使用 jps -l
来查看当前用户有哪些Java进程。
我们写一个简单的SpringBoot
应用,并启动它。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootJwtApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootJwtApplication.class, args);
}
}
- 列出本地机器下所有的Java进程列表,命令
jps -l
其中红框中的数字为进程号,后面的部分为进程名称
- 列出10.211.55.5的Java进程列表,当然前提得是10.211.55.5开启了jstatd RMI服务
jps -l 10.211.55.5
jinfo
jinfo
是用来查看指定进程的运行配置信息 *注意啊,使用Mac的同学,JDK1.8执行此命令会报一个错,据说是JDK1.8的bug,官方推荐用1.8以上的版本使用,我验证过了并踩了这个坑, 如果你使用的macOS并且是jdk1.8,那么恭喜你,你如果执行jinfo
命令,你会报如下错误:
JDK8执行jinfo
yunnasheng@yunnashengdeMacBook-Pro ~ java -version
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)
yunnasheng@yunnashengdeMacBook-Pro ~ jps -l
5125 sun.tools.jps.Jps
2973 org.jetbrains.jps.cmdline.Launcher
2974 com.lb.jwt.SpringbootJwtApplication
463
yunnasheng@yunnashengdeMacBook-Pro ~ jinfo -flags 2974
Attaching to process ID 2974, please wait...
ERROR: attach: task_for_pid(2974) failed: '(os/kern) failure' (5)
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process. Could be caused by an incorrect pid or lack of privileges.
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process. Could be caused by an incorrect pid or lack of privileges.
at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal$BsdDebuggerLocalWorkerThread.execute(BsdDebuggerLocal.java:169)
at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal.attach(BsdDebuggerLocal.java:287)
at sun.jvm.hotspot.HotSpotAgent.attachDebugger(HotSpotAgent.java:671)
at sun.jvm.hotspot.HotSpotAgent.setupDebuggerDarwin(HotSpotAgent.java:659)
at sun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:341)
at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:304)
at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:185)
at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
at sun.jvm.hotspot.tools.JInfo.main(JInfo.java:138)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.tools.jinfo.JInfo.runTool(JInfo.java:108)
at sun.tools.jinfo.JInfo.main(JInfo.java:76)
Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process. Could be caused by an incorrect pid or lack of privileges.
at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal.attach0(Native Method)
at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal.access$100(BsdDebuggerLocal.java:65)
at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal$1AttachTask.doit(BsdDebuggerLocal.java:278)
at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal$BsdDebuggerLocalWorkerThread.run(BsdDebuggerLocal.java:144)
JDK11执行
- 修改jdk环境变量
vim ~/.bash_profile
# jdk11
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-11.0.10.jdk/Contents/Home
# jdk8
#export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home
export PATH=$PATH:$JAVA_HOME/bin
- 使配置生效
source ~/.bash_profile
- 执行
jinfo
yunnasheng@yunnashengdeMacBook-Pro ~ java -version
java version "11.0.10" 2021-01-19 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.10+8-LTS-162)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.10+8-LTS-162, mixed mode)
# 查看进程号
yunnasheng@yunnashengdeMacBook-Pro ~ jps -l
4788 jdk.jcmd/sun.tools.jps.Jps
2973 org.jetbrains.jps.cmdline.Launcher
2974 com.lb.jwt.SpringbootJwtApplication
463
# 查看2974进程的配置信息
yunnasheng@yunnashengdeMacBook-Pro ~ jinfo -flags 2974
VM Flags:
-XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=4 -XX:ConcGCThreads=3 -XX:G1ConcRefinementThreads=10 -XX:G1HeapRegionSize=2097152 -XX:GCDrainStackTargetSize=64 -XX:InitialHeapSize=536870912 -XX:+ManagementServer -XX:MarkStackSize=4194304 -XX:MaxHeapSize=8589934592 -XX:MaxNewSize=5152702464 -XX:MinHeapDeltaBytes=2097152 -XX:NonNMethodCodeHeapSize=7549744 -XX:NonProfiledCodeHeapSize=244108496 -XX:ProfiledCodeHeapSize=0 -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:TieredStopAtLevel=1 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC
- 查看2974进程的最大堆内存,可以使用
jinfo -flag MaxHeapSize pid
来实现。
jinfo -flag MaxHeapSize 2974
-XX:MaxHeapSize=8589934592
jstat
jstat [ generalOption | outputOptions vmid [ interval[s|ms] [ count ] ]
- 统计类加载信息
jstat -class pid times count
# jstat -class pid times count
yunnasheng@yunnashengdeMacBook-Pro ~ jstat -class 2974 1000 3
Loaded Bytes Unloaded Bytes Time
5890 11097.4 0 0.0 0.93
5890 11097.4 0 0.0 0.93
5890 11097.4 0 0.0 0.93
- 统计GC信息
jstat -gc pid times count
yunnasheng@yunnashengdeMacBook-Pro ~ jstat -gc 2974 1000 3
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
0.0 4096.0 0.0 4096.0 81920.0 69632.0 438272.0 3597.4 24060.0 23273.4 3072.0 2736.9 3 0.013 0 0.000 0.013
0.0 4096.0 0.0 4096.0 81920.0 69632.0 438272.0 3597.4 24060.0 23273.4 3072.0 2736.9 3 0.013 0 0.000 0.013
0.0 4096.0 0.0 4096.0 81920.0 69632.0 438272.0 3597.4 24060.0 23273.4 3072.0 2736.9 3 0.013 0 0.000 0.013
参数说明:
- S0C: 当前幸存者空间0的容量(kB).
- S1C: 当前幸存者空间1的容量(kB).
- S0U: 幸存者空间0利用率(kB)
- S1U: 幸存者空间1利用率(kB)
- EC: 当前Eden区的容量(kB).
- EU: Eden区的利用率(kB).
- OC: 当前老年代的容量(kB).
- OU: 老年代利用率 (kB).
- MC: 元空间Metaspace的容量 (kB).
- MU: 元空间Metacspace利用率 (kB).
- CCSC:压缩类空间容量( Compressed class space capacity) (kB).
- CCSU:使用了多少压缩类空间 (kB).
- YGC: 年轻代垃圾收集事件的次数.
- YGCT: 年轻代垃圾收集的耗时
- FGC: full GC 次数.
- FGCT: Full GC耗时.
- GCT: 总GC耗时.