JVM性能调优监控工具(jdk自带命令的使用和VisualVM的使用)

jdk本身就给我们提供了可以查询jvm的指令

jps---查看当前java的线程

Jinfo

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

查看jvm的参数

查看java系统参数

Jstat

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

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

注意:使用的jdk版本是jdk8.

类加载统计:

  1. Loaded:加载class的数量
  2. Bytes:所占用空间大小
  3. Unloaded:未加载数量
  4. Bytes:未加载占用空间
  5. Time:时间

垃圾回收统计

  1. S0C:第一个幸存区的大小
  2. S1C:第二个幸存区的大小
  3. S0U:第一个幸存区的使用大小
  4. S1U:第二个幸存区的使用大小
  5. EC:伊甸园区的大小
  6. EU:伊甸园区的使用大小
  7. OC:老年代大小
  8. OU:老年代使用大小
  9. MC:方法区大小(元空间)
  10. MU:方法区使用大小
  11. CCSC:压缩类空间大小
  12. CCSU:压缩类空间使用大小
  13. YGC:年轻代垃圾回收次数
  14. YGCT:年轻代垃圾回收消耗时间
  15. FGC:老年代垃圾回收次数
  16. FGCT:老年代垃圾回收消耗时间
  17. GCT:垃圾回收消耗总时间

堆内存统计

  1. NGCMN:新生代最小容量
  2. NGCMX:新生代最大容量
  3. NGC:当前新生代容量
  4. S0C:第一个幸存区大小
  5. S1C:第二个幸存区的大小
  6. EC:伊甸园区的大小
  7. OGCMN:老年代最小容量
  8. OGCMX:老年代最大容量
  9. OGC:当前老年代大小
  10. OC:当前老年代大小
  11. MCMN:最小元数据容量
  12. MCMX:最大元数据容量
  13. MC:当前元数据空间大小
  14. CCSMN:最小压缩类空间大小
  15. CCSMX:最大压缩类空间大小
  16. CCSC:当前压缩类空间大小
  17. YGC:年轻代gc次数
  18. FGC:老年代GC次数

新生代垃圾回收统计

  1. S0C:第一个幸存区的大小
  2. S1C:第二个幸存区的大小
  3. S0U:第一个幸存区的使用大小
  4. S1U:第二个幸存区的使用大小
  5. TT:对象在新生代存活的次数
  6. MTT:对象在新生代存活的最大次数
  7. DSS:期望的幸存区大小
  8. EC:伊甸园区的大小
  9. EU:伊甸园区的使用大小
  10. YGC:年轻代垃圾回收次数
  11. YGCT:年轻代垃圾回收消耗时间

新生代内存统计

  1. NGCMN:新生代最小容量
  2. NGCMX:新生代最大容量
  3. NGC:当前新生代容量
  4. S0CMX:最大幸存1区大小
  5. S0C:当前幸存1区大小
  6. S1CMX:最大幸存2区大小
  7. S1C:当前幸存2区大小
  8. ECMX:最大伊甸园区大小
  9. EC:当前伊甸园区大小
  10. YGC:年轻代垃圾回收次数
  11. FGC:老年代回收次数

老年代垃圾回收统计

  1. MC:方法区大小
  2. MU:方法区使用大小
  3. CCSC:压缩类空间大小
  4. CCSU:压缩类空间使用大小
  5. OC:老年代大小
  6. OU:老年代使用大小
  7. YGC:年轻代垃圾回收次数
  8. FGC:老年代垃圾回收次数
  9. FGCT:老年代垃圾回收消耗时间
  10. GCT:垃圾回收消耗总时间

老年代内存统计

  1. OGCMN:老年代最小容量
  2. OGCMX:老年代最大容量
  3. OGC:当前老年代大小
  4. OC:老年代大小
  5. YGC:年轻代垃圾回收次数
  6. FGC:老年代垃圾回收次数
  7. FGCT:老年代垃圾回收消耗时间
  8. GCT:垃圾回收消耗总时间

元数据空间统计

  1. MCMN:最小元数据容量
  2. MCMX:最大元数据容量
  3. MC:当前元数据空间大小
  4. CCSMN:最小压缩类空间大小
  5. CCSMX:最大压缩类空间大小
  6. CCSC:当前压缩类空间大小
  7. YGC:年轻代垃圾回收次数
  8. FGC:老年代垃圾回收次数
  9. FGCT:老年代垃圾回收消耗时间
  10. GCT:垃圾回收消耗总时间

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

Jmap

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

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

打开log.txt,文件内容如下:

  1. num:序号
  2. instances:实例数量
  3. bytes:占用空间大小
  4. class name:类名称

堆信息

堆内存dump

使用VisualVM查看刚刚生成的对内存文件

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

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

借助一个代码:通过死循环来不断往内存添加数据,同时设置vm的内存大小

运行发生内存溢出的异常,然后会把自动导出dump文件在指定的目录

 然后我们可以通过借助图形化界面VisualVM来查看dump文件

看到String这三个占的内存那么多,我们就可以快速定位到发生内存溢出的位置(不要说eclipse也可以看到发生溢出的位置,生产环境可不是运行在eclipse上的)

Jstack

 用jstack查找死锁,见如下示例,也可以用jvisualvm查看死锁

我们程序模拟一个死锁的代码

public class DeadLock {
    public static String obj1 = "obj1";
    public static String obj2 = "obj2";
    public static void main(String[] args){
        Thread a = new Thread(new Lock1());
        Thread b = new Thread(new Lock2());
        a.start();
        b.start();
    }
}
class Lock1 implements Runnable{
    @Override
    public void run(){
        try{
            System.out.println("Lock1 running");
            while(true){
                synchronized(DeadLock.obj1){
                    System.out.println("Lock1 lock obj1");
                    Thread.sleep(3000);//获取obj1后先等一会儿,让Lock2有足够的时间锁住obj2
                    synchronized(DeadLock.obj2){
                        System.out.println("Lock1 lock obj2");
                    }
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
class Lock2 implements Runnable{
    @Override
    public void run(){
        try{
            System.out.println("Lock2 running");
            while(true){
                synchronized(DeadLock.obj2){
                    System.out.println("Lock2 lock obj2");
                    Thread.sleep(3000);
                    synchronized(DeadLock.obj1){
                        System.out.println("Lock2 lock obj1");
                    }
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

然后通过jstack和VisualVM查看死锁

jstack:

 

VisualVM:

其实VisualVM底层也是走jdk提供的那些命令的,就像数据库的图形化界面一样的意思。

VisualVM生成的dump文件和jstack生成是一样的

猜你喜欢

转载自blog.csdn.net/qq_40368860/article/details/84494124