JVM虚拟机调优实战(2)基础调优篇

    科技2024-05-05  95

    jps命令

    解释:查看Java开启的进程

    查看进程:jps -l

    Jinfo 命令

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

    查看jvm的参数 :Jinfo -flags [进程数] 查看java系统参数:jinfo -sysprops [进程数]

    Jstat 命令

    解释:jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。 注意:使用的jdk版本是jdk8.


    类加载统计:jstat -class [进程数] Loaded:加载class的数量 Bytes:所占用空间大小 Unloaded:未加载数量 Bytes:未加载占用空间 Time:时间


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


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


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


    新生代内存统计:jstat -gcnewcapacity [进程数] NGCMN:新生代最小容量 NGCMX:新生代最大容量 NGC:当前新生代容量 S0CMX:最大幸存1区大小 S0C:当前幸存1区大小 S1CMX:最大幸存2区大小 S1C:当前幸存2区大小 ECMX:最大伊甸园区大小 EC:当前伊甸园区大小 YGC:年轻代垃圾回收次数 FGC:老年代回收次数


    老年代垃圾回收统计:jstat -gcold [进程数] MC:方法区大小 MU:方法区使用大小 CCSC:压缩类空间大小 CCSU:压缩类空间使用大小 OC:老年代大小 OU:老年代使用大小 YGC:年轻代垃圾回收次数 FGC:老年代垃圾回收次数 FGCT:老年代垃圾回收消耗时间 GCT:垃圾回收消耗总时间


    老年代内存统计jstat -gcoldcapacity [进程数]

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


    元数据空间统计: jstat -gcmetacapacity [进程数] MCMN:最小元数据容量 MCMX:最大元数据容量 MC:当前元数据空间大小 CCSMN:最小压缩类空间大小 CCSMX:最大压缩类空间大小 CCSC:当前压缩类空间大小 YGC:年轻代垃圾回收次数 FGC:老年代垃圾回收次数 FGCT:老年代垃圾回收消耗时间 GCT:垃圾回收消耗总时间

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

    Jmap命令(面试常问)

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


    实例个数以及占用内存大小:jmap -histo [进程数] > [输出文件地址] 打开log.txt,文件内容如下: num:序号 instances:实例数量 bytes:占用空间大小 class name:类名称


    堆信息:jmap -heap [进程数] 解释:打印堆的一个整体概况


    堆内存dump:jmap -dump:format=b,file=[输出文件名] [进程数]

    -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./ (路径) 这两个参数的意思是:如超过设定的内存阈值(内存溢出)会自动导出dump文件(内存很大的时候,可能会导不出来)

    在用jvisualvm命令工具导入该dump文件分析(方法:右击文件,装入)


    Jstack命令(面试常问)

    解释:jstack查找死锁问题

    示例:死锁代码

    public class DeadLockTest { private static Object lock1 = new Object(); private static Object lock2 = new Object(); public static void main(String[] args) { new Thread(() -> {//线程一 synchronized (lock1) { try { System.out.println("thread1 begin"); Thread.sleep(5000); } catch (InterruptedException e) { } synchronized (lock2) { System.out.println("thread1 end"); } } }).start(); new Thread(() -> {//线程二 synchronized (lock2) { try { System.out.println("thread2 begin"); Thread.sleep(5000); } catch (InterruptedException e) { } synchronized (lock1) { System.out.println("thread2 end"); } } }).start(); System.out.println("main thread end"); } }

    代码解释:线程一将lock1锁住,线程二将lock2锁住,导致线程一去拿lock2去锁(线程二拿lock1去锁)的时候造成了死锁。


    检查死锁位置命令:jstack [进程数]


    或者直接使用jvisualvm命令,打开可视化界面

    Processed: 0.010, SQL: 9