JDK 命令
运行测试程序:
使用jps命令查看Java进程,进程 ID :14876
jmap
查询内存信息
jmap -histo 14876
也可以输出到文件:
jmap -histo 14876 > 路径/log.txt
- 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
也可以dump下来(导入到jvisualvm可视化工具)
jmap -dump:format=b,file=路径\heaplog.hprof 14876
可以设置参数,内存溢出时自动导出文件
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=(路径)
jstack
查找进程死锁
示例程序:
jstack 14876
- Thread-1 #13 :线程名
- prio=5:线程优先级
- tid=0x000000001d363800:线程ID
- nid=0x718:对应OS线程ID
- java.lang.Thread.State: BLOCKED 线程状态
查看线程CPU占用
使用top命令查看Java进程内存情况
top
top -p [port]
按 H 键查看每个进程下面的线程CPU占用
- 找到内存和cpu占用最高的线程tid,比如19664
- 转为十六进制得到 0x4cd0,此为线程id的十六进制表示
- 执行
jstack 19663|grep -A 10 4cd0,得到线程堆栈信息中 4cd0 这个线程所在行的后面10行。
4. 从堆栈中可以发现导致cpu飙高的调用方法。
jinfo
查看正在运行的Java应用程序的扩展参数
查看jvm 参数
jinfo -flags [port]
查看java系统参数
jinfo -sysprops [port]
jstat
以查看堆内存各部分的使用量,以及加载类的数量。
查看进程GC使用率
jstat -gcutil [port]
- S0:幸存1区当前使用比例
- S1:幸存2区当前使用比例
- E:伊甸园区使用比例
- O:老年代使用比例
- M:元数据区使用比例
- CCS:压缩使用比例
- YGC:年轻代垃圾回收次数
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间
- GCT:垃圾回收消耗总时间
查看进程GC
jstat -gc [port] [时间间隔] [打印次数]
- S0C:第一个幸存区的大小,单位KB
- S1C:第二个幸存区的大小
- S0U:第一个幸存区的使用大小S1U:第二个幸存区的使用大小
- EC:伊甸园区的大小
- EU:伊甸园区的使用大小
- OC:老年代大小
- OU:老年代使用大小
- MC:方法区大小(元空间)
- MU:方法区使用大小
- CCSC:压缩类空间大小
- CCSU:压缩类空间使用大小
- YGC:年轻代垃圾回收次数
- YGCT:年轻代垃圾回收消耗时间,单位s
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间,单位s
- GCT:垃圾回收消耗总时间,单位s
查看堆内存
jstat -gccapacity [port]
- NGCMN:新生代最小容量
- NGCMX:新生代最大容量
- NGC:当前新生代容量
- S0C:第一个幸存区大小
- S1C:第二个幸存区的大小
- EC:伊甸园区的大小
- OGCMN:老年代最小容量
- OGCMX:老年代最大容量
- OGC:当前老年代大小
- OC:当前老年代大小
- MCMN:最小元数据容量
- MCMX:最大元数据容量
- MC:当前元数据空间大小
- CCSMN:最小压缩类空间大小
- CCSMX:最大压缩类空间大小
- CCSC:当前压缩类空间大小
- YGC:年轻代gc次数
- FGC:老年代GC次数
新生代垃圾回收统计
jstat -gcnew [port]
- S0C:第一个幸存区的大小
- S1C:第二个幸存区的大小
- S0U:第一个幸存区的使用大小
- S1U:第二个幸存区的使用大小
- TT:对象在新生代存活的次数
- MTT:对象在新生代存活的最大次数
- DSS:期望的幸存区大小
- EC:伊甸园区的大小
- EU:伊甸园区的使用大小
- YGC:年轻代垃圾回收次数
- YGCT:年轻代垃圾回收消耗时间
新生代内存统计
jstat -gcnewcapacity [port]
- NGCMN:新生代最小容量
- NGCMX:新生代最大容量
- NGC:当前新生代容量
- S0CMX:最大幸存1区大小
- S0C:当前幸存1区大小
- S1CMX:最大幸存2区大小
- S1C:当前幸存2区大小
- ECMX:最大伊甸园区大小
- EC:当前伊甸园区大小
- YGC:年轻代垃圾回收次数
- FGC:老年代回收次数
老年代垃圾回收统计
jstat -gcold [port]
- MC:方法区大小
- MU:方法区使用大小
- CCSC:压缩类空间大小
- CCSU:压缩类空间使用大小
- OC:老年代大小
- OU:老年代使用大小
- YGC:年轻代垃圾回收次数
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间
- GCT:垃圾回收消耗总时间
老年代内存统计
jstat -gcoldcapacity [port]
- OGCMN:老年代最小容量
- OGCMX:老年代最大容量
- OGC:当前老年代大小
- OC:老年代大小
- YGC:年轻代垃圾回收次数
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间
- GCT:垃圾回收消耗总时间
元数据空间统计
jstat -gcmetacapacity [port]
- MCMN:最小元数据容量
- MCMX:最大元数据容量
- MC:当前元数据空间大小
- CCSMN:最小压缩类空间大小
- CCSMX:最大压缩类空间大小
- CCSC:当前压缩类空间大小
- YGC:年轻代垃圾回收次数
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间
- GCT:垃圾回收消耗总时间
JVM 调优就是减少FULL GC,简单来说就是让每次YONG GC 后存活的对象总大小 < survivor 区域大小的 50%,都留在年轻代里。