JVM监控及故障排查

在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);
    }
}
  1. 列出本地机器下所有的Java进程列表,命令jps -l 其中红框中的数字为进程号,后面的部分为进程名称
  2. 列出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执行

  1. 修改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
  1. 使配置生效source ~/.bash_profile
  2. 执行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耗时.
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当谈到 JVM 监控的背景时,可以从以下几个方面进行细化: 1. JVM 运行时环境:JVMJava虚拟机)是Java平台的核心组件,负责将Java字节码转换成机器码并执行。JVM提供了一些内置的监控工具和API,用于收集和报告有关应用程序性能和行为的信息。 2. 应用程序复杂性增加:随着应用程序的复杂性不断增加,尤其是在大规模和分布式系统中,需要对JVM进行监控来了解应用程序的性能和行为。监控可以帮助开发人员识别和解决性能问题、内存泄漏、线程问题等。 3. 性能优化需求:对于企业级应用程序而言,性能是关键指标之一。通过监控JVM,可以了解应用程序的资源利用情况、瓶颈点以及优化潜力。这有助于开发人员进行性能调优,提高应用程序的响应时间和吞吐量。 4. 故障排查和容错能力:当应用程序发生故障或异常时,监控JVM可以提供宝贵的信息来帮助定位问题。通过监控内存、线程、日志等指标,可以追踪异常发生的原因,并采取适当的措施来修复问题,提高应用程序的可靠性和稳定性。 5. 资源管理和容量规划:监控JVM可以提供关于资源使用情况的实时数据,如内存、CPU、磁盘等。这有助于进行容量规划,预测未来的资源需求,并确保应用程序在高负载情况下仍能正常运行。 总而言之,JVM监控的背景可以归结为应对应用程序复杂性增加、性能优化需求、故障排查和容错能力、资源管理和容量规划等方面的需求。通过监控JVM,开发人员和运维人员能够获得关键的运行时数据,以便更好地管理、维护和优化应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值