JVM-03 JVM性能调优监控工具

不念不忘少年蓝@ 2022-03-16 03:22 658阅读 0赞

文章目录

  • 1.Jinfo
    • 1.1 查看jvm的参数
    • 1.2 查看java系统参数
  • 2.Jstat
    • 2.1 类加载统计
    • 2.2 垃圾回收统计
    • 2.3 堆内存统计
    • 2.4 新生代垃圾回收统计
    • 2.5 新生代内存统计
    • 2.6 老年代垃圾回收统计
    • 2.7 老年代内存统计
    • 2.8 元数据空间统计
    • 2.9 gc工具
  • 3.Jmap
    • 3.1 实例个数以及占用内存大小
    • 3.2 堆信息(mac报错)
    • 3.3 堆内存dump
      • 3.3.1 内存溢出示例
      • 3.3.2 远程连接jvisualvm
  • 4.Jstack
    • 4.1 用jstack查找死锁(也可以用jvisualvm查看死锁)
    • 4.2 jstack找出占用cpu最高的堆栈信息

1.Jinfo

查看正在运行的Java应用程序的扩展参数

1.1 查看jvm的参数

运行一个jar程序jps查看下进程号
在这里插入图片描述

1.2 查看java系统参数

在这里插入图片描述

2.Jstat

jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:

  1. jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]

注意:使用的jdk版本是jdk8.
在这里插入图片描述

2.1 类加载统计

  1. jstat -class 10616

在这里插入图片描述

  • Loaded:加载class的数量
  • Bytes:所占用空间大小
  • Unloaded:未加载数量
  • Bytes:未加载占用空间
  • Time:时间

2.2 垃圾回收统计

  1. jstat -gc 10616

在这里插入图片描述

  • S0C:第一个幸存区的大小
  • S1C:第二个幸存区的大小
  • S0U:第一个幸存区的使用大小
  • S1U:第二个幸存区的使用大小
  • EC:伊甸园区的大小
  • EU:伊甸园区的使用大小
  • OC:老年代大小
  • OU:老年代使用大小
  • MC:方法区大小(元空间)
  • MU:方法区使用大小
  • CCSC:压缩类空间大小
  • CCSU:压缩类空间使用大小
  • YGC:年轻代垃圾回收次数
  • YGCT:年轻代垃圾回收消耗时间
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

2.3 堆内存统计

  1. jstat -gccapacity 10616

在这里插入图片描述

  • NGCMN:新生代最小容量
  • NGCMX:新生代最大容量
  • NGC:当前新生代容量
  • S0C:第一个幸存区大小
  • S1C:第二个幸存区的大小
  • EC:伊甸园区的大小
  • OGCMN:老年代最小容量
  • OGCMX:老年代最大容量
  • OGC:当前老年代大小
  • OC:当前老年代大小
  • MCMN:最小元数据容量
  • MCMX:最大元数据容量
  • MC:当前元数据空间大小
  • CCSMN:最小压缩类空间大小
  • CCSMX:最大压缩类空间大小
  • CCSC:当前压缩类空间大小
  • YGC:年轻代gc次数
  • FGC:老年代GC次数

2.4 新生代垃圾回收统计

  1. jstat -gcnew 10616

在这里插入图片描述

  • S0C:第一个幸存区的大小
  • S1C:第二个幸存区的大小
  • S0U:第一个幸存区的使用大小
  • S1U:第二个幸存区的使用大小
  • TT:对象在新生代存活的次数
  • MTT:对象在新生代存活的最大次数
  • DSS:期望的幸存区大小
  • EC:伊甸园区的大小
  • EU:伊甸园区的使用大小
  • YGC:年轻代垃圾回收次数
  • YGCT:年轻代垃圾回收消耗时间

2.5 新生代内存统计

  1. jstat -gcnewcapacity 10616

在这里插入图片描述

  • NGCMN:新生代最小容量
  • NGCMX:新生代最大容量
  • NGC:当前新生代容量
  • S0CMX:最大幸存1区大小
  • S0C:当前幸存1区大小
  • S1CMX:最大幸存2区大小
  • S1C:当前幸存2区大小
  • ECMX:最大伊甸园区大小
  • EC:当前伊甸园区大小
  • YGC:年轻代垃圾回收次数
  • FGC:老年代回收次数

2.6 老年代垃圾回收统计

  1. jstat -gcold 10616

在这里插入图片描述

  • MC:方法区大小
  • MU:方法区使用大小
  • CCSC:压缩类空间大小
  • CCSU:压缩类空间使用大小
  • OC:老年代大小
  • OU:老年代使用大小
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

2.7 老年代内存统计

  1. jstat -gcoldcapacity 10616

在这里插入图片描述

  • OGCMN:老年代最小容量
  • OGCMX:老年代最大容量
  • OGC:当前老年代大小
  • OC:老年代大小
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

2.8 元数据空间统计

  1. jstat -gcmetacapacity 10616

在这里插入图片描述

  • MCMN:最小元数据容量
  • MCMX:最大元数据容量
  • MC:当前元数据空间大小
  • CCSMN:最小压缩类空间大小
  • CCSMX:最大压缩类空间大小
  • CCSC:当前压缩类空间大小
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

2.9 gc工具

  1. jstat -gcutil 10616

在这里插入图片描述

  • S0:幸存1区当前使用比例
  • S1:幸存2区当前使用比例
  • E:伊甸园区使用比例
  • O:老年代使用比例
  • M:元数据区使用比例
  • CCS:压缩使用比例
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

3.Jmap

此命令可以用来查看内存信息。

3.1 实例个数以及占用内存大小

  1. jmap -histo 10616 > /iotcloud/log.txt

在这里插入图片描述

  • num:序号
  • instances:实例数量
  • bytes:占用空间大小
  • class name:类名称

3.2 堆信息(mac报错)

在这里插入图片描述

3.3 堆内存dump

  1. jmap -dump:format=b,file=/iotcloud/test.hprof 11264

也可以设置内存溢出自动导出dump文件(内存很大的时候,可能会导不出来)

  1. -XX:+HeapDumpOnOutOfMemoryError
  2. -XX:HeapDumpPath=./ (路径)

可视化平台

  1. jvisualvm

在这里插入图片描述

3.3.1 内存溢出示例

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.UUID;
  4. /**
  5. * 描述:内存溢出测试
  6. * @author: myx
  7. * @date: 2019/1/20
  8. * Copyright © 2018-hotpot. All rights reserved.
  9. */
  10. public class OOMTest {
  11. // JVM设置
  12. // -Xms10M -Xmx10M -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/iotcloud/jvm.dump
  13. public static void main(String[] args) {
  14. List<Object> list = new ArrayList<>();
  15. int i = 0;
  16. while (true) {
  17. list.add(new User(i++, UUID.randomUUID().toString()));
  18. }
  19. }
  20. }

在这里插入图片描述

运行代码

在这里插入图片描述
导入dump文件

在这里插入图片描述

3.3.2 远程连接jvisualvm

  • 启动普通的jar程序JMX端口配置:

    java -Djava.rmi.server.hostname=10.1.202.28 -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar foo.jar

  • tomcat的JMX配置

    JAVA_OPTS=-Djava.rmi.server.hostname=10.1.202.28 -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

jvisualvm远程连接服务需要在远程服务器上配置host(连接ip 主机名),并且要关闭防火墙

  • 问题
    远程访问JMX遇到连接不上的问题

4.Jstack

排查死锁

  1. jstack 11264

在这里插入图片描述

4.1 用jstack查找死锁(也可以用jvisualvm查看死锁)

  1. /** * 描述:死锁示例 * @author: myx * @date: 2019/1/20 * Copyright © 2018-hotpot. All rights reserved. */
  2. public class DeadLockTest {
  3. private static Object lock1 = new Object();
  4. private static Object lock2 = new Object();
  5. public static void main(String[] args) {
  6. new Thread(() -> {
  7. synchronized (lock1) {
  8. try {
  9. System.out.println("thread1 begin");
  10. Thread.sleep(5000);
  11. } catch (InterruptedException e) {
  12. }
  13. synchronized (lock2) {
  14. System.out.println("thread1 end");
  15. }
  16. }
  17. }).start();
  18. new Thread(() -> {
  19. synchronized (lock2) {
  20. try {
  21. System.out.println("thread2 begin");
  22. Thread.sleep(5000);
  23. } catch (InterruptedException e) {
  24. }
  25. synchronized (lock1) {
  26. System.out.println("thread2 end");
  27. }
  28. }
  29. }).start();
  30. System.out.println("main thread end");
  31. }
  32. }

在这里插入图片描述

在这里插入图片描述
jvisualvm查看死锁

在这里插入图片描述

4.2 jstack找出占用cpu最高的堆栈信息

  1. 使用命令top -p ,显示你的java进程的内存情况,pid是你的java进程号,比如4977
  2. 按H,获取每个线程的内存情况
  3. 找到内存和cpu占用最高的线程tid,比如4977
  4. 转为十六进制得到 0x1371 ,此为线程id的十六进制表示
  5. 执行 jstack 4977|grep -A 10 1371,得到线程堆栈信息中1371这个线程所在行的后面10行
  6. 查看对应的堆栈信息找出可能存在问题的代码

更多JVM相关知识请参考目录:JVM学习目录

发表评论

表情:
评论列表 (有 0 条评论,658人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JVM性能工具

    一、JDK工具 先来看看有哪些常用的工具可以辅助我们进行性能调优和问题排查,后面再通过一个具体的示例结合工具来分析调优。 1、JDK工具 JDK自带了很多性能监控