Java之JVM监控工具分享

 

Java之JVM监控工具分享

JVM的基本知识常用的也就是类加载机制内存区域、分配、OOMGCJVM参数调优

几个链接自己看:

今天结合代码讲一讲常用的java自带工具讲解,这些命令一般都是jdk/lib/tools.jar中。用来监控诊断我们的Java环境。

官方说明: https://docs.oracle.com/en/java/javase/11/tools/

1. jps

显示当前用户的所有java进程的PID 以及主类名

jps              : 显示当前用户的所有java进程的PID 以及主类名 jps -v           : 打印传递给 Java 虚拟机的参数(如-XX:+UnlockExperimentalVMOptions -XX:+UseZGC) jps -m           : 打印传递给主类的参数 jps -l           : 打印模块名以及包名

默认开启(UsePerfData),若加上-XX:-UsePerfData 则无法找到进程。

2. jstack

功能 jstack不仅会打印线程的栈轨迹、线程状态(BLOCKED)、持有的锁(locked…)以及正在请求的锁(waiting to lock …),而且还会分析出具体的死锁

jstack pid       : 查看线程情况 jstack -F pid    : 正常输出不被响应时,使用该指令 jstack -l pid    : 除堆栈外,显示关于锁的附件信息

3. jstat

功能 允许用户查看目标 Java 进程的类加载、即时编译以及垃圾回收相关的信息。它常用于检测垃圾回收GC问题以及内存泄漏问题。
显示进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
常用指令

jstat -class pid              : 打印类装载、类卸载、总空间以及所消耗的时间 jstat -compiler pid           : 打印即时编译相关的数据 jstat -printcompilation pid   : 打印即时编译相关的数据 jstat -gc pid 1s 20           : 查询垃圾收集情况,每1秒查询一次,一共查询20次。 jstat -gccause pid            : 额外输出上次GC原因 ...剩下的都是以-gc为前缀的子命令,它们将打印垃圾回收相关的数据。 加上 -t参数 每行数据之前打印目标 Java 进程的启动时间

我们可以看到,这两个 Survivor 区的容量相等,而且始终有一个 Survivor 区的内存使用量为 0。
在这种情况下,Java 虚拟机会将这块内存区域回收,并标记为可分配的状态。这样子做的结果是,堆中可能完全没有 Survivor 内存区域,因而相应的 S1C 和 S1U 将会是 0。

我们可以比较 Java 进程的启动时间以及总 GC 时间(GCT 列),或者两次测量的间隔时间以及总GC时间的增量,来得出 GC 时间占运行时间的比例。
如果该比例超过 20%,则说明目前堆的压力较大;如果该比例超过 90%,则说明堆里几乎没有可用空间,随时都可能抛出 OOM 异常。

jstat还可以用来判断是否出现内存泄漏。在长时间运行的 Java 程序中,我们可以运行jstat命令连续获取多行性能数据,并取这几行数据中 OU 列(即已占用的老年代内存)的最小值。
然后,我们每隔一段较长的时间重复一次上述操作,来获得多组 OU 最小值。如果这些值呈上涨趋势,则说明该 Java 程序的老年代内存已使用量在不断上涨,这意味着无法回收的对象在不断增加,因此很有可能存在内存泄漏。

关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信