是否内存泄漏:
1)老年代逐步增长?
2)FullGC卡顿?
3)年轻代的内存一直在高位无法释放?
4)频繁Full GC?
5)资源关闭?(IO流不关闭会内存泄漏吗?不会的,但是会频繁GC,如果关闭,内存会缓慢上涨,然后触发一次fullGC(推荐),文件句柄也会存在对应的内存哦!)
常用命令:
1)查看资源使用情况
2)jstat -gc <pid> 查看java进程的GC状态
S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
SoU:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小《
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
3)top -Hp <pid> 可以查看该进程下各个线程的cpu使用情况
4)jstack <pid> 查看当前java进程的堆栈状态,例如: jstack 1420 | grep -A 10 'printf "%x\n" 1477'
5)jmap -histo:live <pid> 查看存活的对象情况
6)jinfo <pid> 查看进程配置信息
7)jmap -dump:live, format=b,file=heap.hprof <pid> 下载dump文件在本地进行分析,使用像MAT工具进行打开
①堆内内存泄漏排查 (推荐heapDump在线分析工具:heaphero)
heapDump文件生成:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=E://temp.hprof
将temp.hprof 上传到https://heaphero.io/heap-index.jsp 我们将文件上传到HeapHero进行分析(文件大的话最好压缩为zip格式)
打印垃圾回收信息:
jstat -gcutil <pid> 2000 10 (每2秒打印一次,一共打印10次)
查看堆内存中的实例数量以及内存大小情况:
默认按照占用内存大小降序排序
jmap -histo <pid>
jmap -histo <pid> | head -30 (取内存占用最高的前三十个对象)
jmap -histo <pid> | sort -k 2 -g -r | head 30(按实例数量降序排序取前三十)
jmap -histo 1 <pid> | grep redisson | sort -k 2 -g -r | head 30 (按照实例数量降序排序取前三十,在内容中搜索redisson)
#instance 是对象的实例个数
#bytes 是总占用的字节数
#class name 对应的就是Class 文件里的class的标识
B 代表 byte
C 代表 char
D 代表 double
F 代表float
I 代表 int
J 代表 long
Z 代表 boolean
前边有[ 代表数组,[I 就相当于 int[]]
评论区