前言
这段时间以来都没有写过文章了,以为要换工作的原因,所以一直在为面试做准备,面试了几家收到了4个offer,连我也不知道什么时候这么抢手了,后来选择了一家做医疗的大公司工作,废话不多说,今天开始陆续写文章。
这里不说其他的,只说内存的溢出以及怎么排查,这也是面试会被面试官问到的问题。以下的方式适合初学者。
定位问题
top命令查看最耗CPU的进程
这里输入top 命令之后键入大写的 P ,进程按照 CPU 从高到底排序。
查看最消耗 CPU 的线程,比如一下这个进程:
1612 为进程号,键入大写 P,该进程中的线程按照 CPU 从高到底排序
top -Hp 1612
将上面线程号 31467 转为 16 进制,如下:
将线程号转为 16 进制;其中 31467 为线程号printf ‘%x\n’ 31467
29962 为进程号,0x7aeb 为最耗 CPU 线程的十六进制jstack 29962 | grep ‘0x7aeb’ -C10 --color
下面我们用 Jmap 的命令查看当前堆的使用情况,如下:
jmap -heap 31467这里的 31467 是进程号,不要搞错了哦
查看 gc 回收频率jstat -gcutil 31467 5000,这里的 37769 为进程号,5000 是指每 5 秒输出一次,如下:
上图中 O 代表老年代占用率,FGC 是 FullGC 次数,FGCT 是 fullGC 时间。
生成 dump 文件命令
因为我这里没有报内存溢出的问题,没有保留JVM内存文件,只说实现方式就好。这里我们导出 dump 文件进行分析找到原因。
jmap -dump:format=b,file=fileName.dump pid,fileName 是导出后 dump 名称,pid 为进程号
把 dump 文件导出到本地以后用 Eclipse Memary Analysis 进行分析,可以到官问下载:MAT下载地址
下载完以后安装打开,如下步骤导入即可,关于查看方式可以网上了解一下,很容易就懂。