“如果发生内存泄漏怎么排查”
昨天,一个工作3年的粉丝,在投递了200多家公司以后,终于约到了面试机会。
由于没有实操过,所以被问到:“如果发生内存泄漏怎么排查这个问题的时候”,就不知道该怎么回答了。
这个问题在我之前整理的大厂面试指南里面,有标准的回答,大家可以扫描文章底部二维码领取。
问题解析
内存泄露的面试频率还挺高的,一方面它是一个比较重要的基础知识,另一方面,我们写的所有程序都是运行在JVM上,
在出现故障的时候,需要开发人员具备解决该问题的能力。
这个问题分为两个部分:
-
什么是内存泄露以及会带来什么影响
-
内存泄露的排查和解决方法
内存泄漏指的是在程序运行过程中,因为某些原因导致不需要使用的对象,
仍然占用JVM的内存空间并且这块内存还无法被回收。
最终导致程序占用的内存越来越大从而出现OOM错误或者影响程序性能。
一般情况下,除了OOM这种错误以外,内存泄露会有一些比较明显的现象,比如频繁的Full GC; 内存占用量过大一直无法释放等。
下面来看一下这个问题的回答。
问题答案
内存泄露的排查,我一般会根据现象去定位问题。
所以第一步,会先去定位是否是内存泄露,比如老年代逐步增长、fullGC卡顿、年轻代的内存一直在高位无法释放、频繁full gc等。
这些现象基本上都是内存出现异常。
要了解gc的情况,可以使用jstat命令,查看虚拟机中各个内存区域的使用情况和gc情况。
然后使用dump工具,把当前内存dump下来,然后使用MAT工具来分析。
如果dump的文件比较大,可以使用轻量级的在线分析工具jmap。
MAT工具会自动分析dump文件的内容,给出一个分析结果并定位到有问题的类,然后去对这部分代码进行优化即可
一般可能是循环引用、内存对象泄露没有被销毁、动态分配内存以后未释放、长期持有对象引用、资源未关闭等。
总结
下次面试的时候遇到这个问题,大家知道怎么回答了吗?
如果你喜欢我的作品,记得点赞收藏加关注哦!!!
另外,我将所有Java面试系列制作成了完整的面试文档。它的便捷之处在于,可以通过检索的方式,找到你想要的面试题,目前已经更新200期,总计超过20W字!