作为一个程序员来说,内存是一个绕不过去的坎。虽然如今设备的性能都呈摩尔指数上涨,但是内存还是有限的,写代码时熟知每块内存,分配是回收再优化,是一个非常考验人的过程,而这个会直接影响到你整个项目工程。而面试中,如果说有个话题能考验面试官的水平,以及他和你引起的共鸣,那么内存绝对是一个最适合不够的东西,你可以跟他聊内存管理,内存泄露,内存优化等。涉及到这个,只要你能有点见解,那么level绝对是高级。今天就从最简单的几个方面来聊一聊内存泄露

内存区
如果有人问你这个问题,我觉得这么简短回答即可,就是堆,栈,自由存储区,全局/静态存储区和常量存储区。基本简单回答就好,如果你能在深入的话,就要根据你面试的岗位来简要阐述,比如当初我面试字节跳动的windows视频开发,会沟通交流一下windows的内存管理,windows实现按需调页的虚拟内存机制,这个就有点高级了。。。
内存泄露的几种方式
这个可能网上有答案,就是常发性,偶发性,一次性,隐式内存泄露。但是我希望你能够阐述具体点,比如以下说法
a.忘记释放内存, 没有delete掉,会造成内存泄露;
b.野指针现象,已经释放内存,但未置空,会造成内存泄露;
c.越界访问,比如数组越界,容器越界等;
d.内存未初始化就引用;
e.内存未分配成功就使用,比如在构造函数未成功就调用了,也会造成内存问题
这几个要素,其实都比较简单,你可以具体列举一下你平时项目中遇到的问题,比如说数据流,视频流,图片流,这种需要大量内存块的东西,处理不当是最容易引起内存泄露的;

内存泄露分析
这个分析技术就比较多种多元化。这里列举几种我觉得比较共性的方式。
a.dump文件分析+log。崩溃产生的dump文件,去分析崩溃时的内存和区间变量情况,配合log找出crash的点。
b.代码预处理,单元测试。其实这个也就是说在代码做比较多的处理和标记,然后根据特征点的日志做分析
c.多测试。对代码进行比较多的测试。
d.review之前的代码。针对指针,堆,析构函数这些地方做比较多的判断。其实网上也表达了几种方式,但是我希望这里你能够提出自己的见解。

内存溢出的概念
有很多人把内存泄露和内存溢出混淆,其实这是不对的。内存泄露和内存溢出不是等同的概念。内存溢出是指无法回收的内存或使用的内存过多使得程序运行要用到的内存大于虚拟机能提供的最大内存。内存溢出可能是内存泄露引起的。简单来讲,就是程序运行时内存超负荷了,具体表现就是你可以在windows的任务管理器上看到你的内存爆满,然后机子处于卡顿状态。