面试题:如果线上系统出现了内存溢出的问题,我们如何进行定位和解决?
面试题常规回答
可以先使用jmap命令 jmap -dump:live,format=b,file=dump.hprof PID
根据当时的堆内存生成快照并放到一个文件。然后使用MAT软件打开这个内存快照,分析一下具体是哪里的代码产生的大量对象并且没有被回收,持续性的内存泄露最终造成内存溢出的。
面试题深入剖析
首先是先看看流量监控,是否瞬间有大量请求涌入,达到了系统的承载的上限,最终导致内存溢出的。这个时候就需要紧急扩容服务器和内存了。
如果是正常的运行,非外部原因导致的话,一般只能是内存泄露导致的,这个时候才使用jmap导出当时的堆内存快照,并且立刻重启系统,恢复系统运行。
接下来使用MAT软件打开这个内存快照,在工具栏可以找到 Leak Suspects
的按钮,就是内存泄漏的分析入口。
如果内存快照太大导致MAT打不开的话,需要先在MemoryAnalyzer.ini
配置文件设置修改一下MAT的堆内存大小,比如设置为4G