8
回答
非诚勿扰贴——如何修复内存泄露?
百度AI开发者大赛带你边学边开发,赢100万奖金,加群:418589053   

面试经常被面到这个问题,我觉得应该从这几方面问:

1.内存泄露与内存溢出的区别

2.程序OOM时,如何确定他是内存泄露还是内存溢出

3.确定后分别如何解决

请各位大牛们畅谈。小弟不慎感激。

<无标签>
举报
孟非
发帖于5年前 8回/436阅

以下是问题补充:

  • @孟非 :问题表述有点问题,应该是内存泄露还是堆空间太小引起的OOM (5年前)
共有8个答案 最后回答: 5年前
。。。看了楼上的链接,我还是不回答了。毕竟我不懂java。哈。如果是正常理解,内存溢出,是你开的空间比你要用的空间小。内存泄漏,是你拿的空间比你实际释放的空间要多。前面的错误是程序员想当然,外部函数调用进入时没有做边界检测,后面通常是同一个地址释放多次,你以为释放了不同的地方。至于申请了没释放这种错误,那基本上是要扔出去的。不考虑。。。如果在c语言里面,对于释放地址问题,要确定某个指针变量是唯一指示,申请后,释放前都是由它保管空间,别乱将这个功能转移给其他变量。哪怕它没别的作用。用特殊前缀或后缀来提示自己。

这个问题问的很弱智, OOM 就是内存溢出,可能有多种原因导致,内存泄露只是可能导致内存溢出的一个原因而已。

内存溢出和内存泄漏并不是一个层次上的问题。他们没有可比性。

--- 共有 3 条评论 ---
javascrack回复 @孟非 : dump快照 mat 分析 5年前 回复
huan主要是看看应用中是否有大量的大内存对象分配,另外再看看内存占用的趋势,和分析dump文件,内存泄漏一般会在老年代有大量的长时间生存的对象。 5年前 回复
孟非谢谢您的回复,问题的初衷是想问: 1.是因为内存泄露引起还是因为堆太小引起的OOM 2.如何确定2者 3.如何定位问题 5年前 回复

溢出就是访问不该访问的空间. 常见的有野指针的访问, 堆空间溢出.

内存泄漏是程序运行过程中 应该回收的内存空间没有被正确回收.造成可用空间越来越少.最后变成无内存资源可以被应用程序申请.

内存溢出肯定会产生意外的结果. 出现内存溢出比较好的结果是程序退出, 糟糕的结果就是被调用者有意溢出到特定内存上,执行了特定代码,达到越权或者泄密的目的.

内存泄漏通常都是隐蔽的消耗掉资源,相对来说,造成危害只是程序本身无法工作并且影响系统其他进程的相应速度.

--- 共有 4 条评论 ---
泡不烂的凉粉回复 @huan : 你说的对. 5年前 回复
huan缓冲区溢出和栈溢出与内存溢出不是一个概念 5年前 回复
泡不烂的凉粉回复 @huan : 溢出没有被捕获到,或者代码中没有处理掉就造成了非法访问.是攻击手段最经常找的缺陷.用特定的示例造成溢出,进而获取更大的访问权限.来进行攻击. 5年前 回复
huan内存的非法访问和溢出不是一回事 5年前 回复
顶部