java jvm OOM内存溢出问题排查

查看docker运行状态
docker stats cid

查看容器重启次数
docker inspect -f “{ { .RestartCount }}” container-id
查看容器最后一次的启动时间
docker inspect -f “{ { .State.StartedAt }}” container-id
进入docker 容器:
docker exec -it 29198c060396 /bin/sh

jmap 内存分析

jmap -heap 10765
查看新生代,老生代堆内存的分配大小以及使用情况,看是否本身分配过小
jmap -histo:live 10765 | more
查找最耗内存的对象 以表格的形式显示存活对象的信息,并按照所占内存大小排序
jmap -dump:format=b,file=dumpfile.bin pid
使用jmap生成堆转储文件 使用JProfiler、MAT内存分析。

jmap -dump:format=b, file=dumpfile.bin pid
docker cp 29198c060396:/dumpfile.bin .
导出jmap dump的文件,进一步分析,copy docker中的文件到宿主机

jstack 查看线程信息

jstack pid

jstat 性能分析

Docker容器中使用jstat过程
列出docker容器:docker ps
标准输入和关联终端:docker exec -it 容器ID /bin/bash
查找出java进程: ps – ef | grep java
统计gc信息统计: jstat –gcutil 466 3000 每三秒打印一次

1.jstat -gc pid
可以显示gc的信息,查看gc的次数,及时间。
其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
2.jstat -gccapacity pid
可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,
如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,
PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。
其他的可以根据这个类推, OC是old内纯的占用量。
3.jstat -gcutil pid
统计gc信息统计。
4.jstat -gcnew pid
年轻代对象的信息。
5.jstat -gcnewcapacity pid
年轻代对象的信息及其占用量。
6.jstat -gcold pid
old代对象的信息。
7.stat -gcoldcapacity pid
old代对象的信息及其占用量。
8.jstat -gcpermcapacity pid
perm对象的信息及其占用量。
9.jstat -class pid
显示加载class的数量,及所占空间等信息。
10.jstat -compiler pid
显示VM实时编译的数量等信息。
11.stat -printcompilation pid
当前VM执行的信息。
jstat -gccause pid 1 每格1毫秒输出结果
jstat -gccause pid 3000 每格3秒输出结果

图中参数含义如下:
S0 — Heap上的 Survivorspace 0 区已使用空间的百分比
S1 — Heap上的 Survivorspace 1 区已使用空间的百分比
E — Heap上的 Eden space区已使用空间的百分比
O — Heap上的 Old space 区已使用空间的百分比
P — Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 YoungGC 的次数
YGCT –从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC的次数
FGCT –从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)

参考文档:
难忘的OOM缉凶之旅

你可能感兴趣的:(JVM)