【jvm-2】jvm调优-命令篇

440 阅读5分钟

上一篇【jvm-1】类的加载机制

JDK 命令

image.png

运行测试程序:

image.png

使用jps命令查看Java进程,进程 ID :14876

image.png

jmap

image.png

查询内存信息

jmap -histo 14876

image.png

也可以输出到文件:

jmap -histo 14876 > 路径/log.txt

image.png

  • num : 序号
  • instance:实例数量
  • bytes:占用内存大小
  • class name :类名 [C is a char[],[S is a short[],[I is a int[],[B is a byte[],[[I is a int[]

查询堆信息

jmap -heap 14876

image.png

也可以dump下来(导入到jvisualvm可视化工具)

jmap -dump:format=b,file=路径\heaplog.hprof 14876

image.png

可以设置参数,内存溢出时自动导出文件

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=(路径)

jstack

image.png

查找进程死锁

示例程序:

image.png image.png

jstack 14876

image.png

  • Thread-1 #13 :线程名
  • prio=5:线程优先级
  • tid=0x000000001d363800:线程ID
  • nid=0x718:对应OS线程ID
  • java.lang.Thread.State: BLOCKED 线程状态

image.png

查看线程CPU占用

使用top命令查看Java进程内存情况

top

image.png

top -p [port]

image.png 按 H 键查看每个进程下面的线程CPU占用

image.png

  1. 找到内存和cpu占用最高的线程tid,比如19664
  2. 转为十六进制得到 0x4cd0,此为线程id的十六进制表示
  3. 执行 jstack 19663|grep -A 10 4cd0,得到线程堆栈信息中 4cd0 这个线程所在行的后面10行。

image.png 4. 从堆栈中可以发现导致cpu飙高的调用方法。

jinfo

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

查看jvm 参数

jinfo -flags [port]

image.png

查看java系统参数

jinfo -sysprops [port]

image.png image.png

jstat

以查看堆内存各部分的使用量,以及加载类的数量。 image.png

查看进程GC使用率

jstat -gcutil [port]

image.png

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

查看进程GC

jstat -gc [port] [时间间隔] [打印次数]

image.png

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

查看堆内存

jstat -gccapacity [port] image.png

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

新生代垃圾回收统计

jstat -gcnew [port]

image.png

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

新生代内存统计

jstat -gcnewcapacity [port]

image.png

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

老年代垃圾回收统计

jstat -gcold [port]

image.png

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

老年代内存统计

jstat -gcoldcapacity [port]

image.png

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

元数据空间统计

jstat -gcmetacapacity [port]

image.png

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

JVM 调优就是减少FULL GC,简单来说就是让每次YONG GC 后存活的对象总大小 < survivor 区域大小的 50%,都留在年轻代里。