面试经常被面到这个问题,我觉得应该从这几方面问:1.内存泄露与内存溢出的区别2.程序OOM时,如何确定他是内存泄露还是内存溢出3.确定后分别如何解决请各位大牛们畅谈。小弟不慎感激。jvm内存泄露oom内存溢出

解决方案 »

  1.   

    - - 这是个经验问题,写程序少的或者没有工作经验的人一般比较模糊。
    1、内存泄露是指,程序在运行期间,有一部分内存没有或者无法被回收,而内存溢出是指程序对内存的使用量超出给它的额定使用量。它们之间有一定关系,但是没有必然的关系,内存泄露不一定会内存溢出,而内存溢出也不一定就是内存泄露造成的。
    2、OOM时,肯定是内存溢出,因为这个错误就是内存溢出错误,因此只要判断这个溢出是否内存泄露造成的,还是非内存泄露,也许是给定的额定内存不足以满足需求,也可能是程序设计的缺陷,如果是c++,或者C,就要分析内存是否被free掉,而java的话,基本上就是List或者Map,而且通常是静态的才会造成泄露(jni不在此讨论范畴)。
    3、如果是内存泄露,查找起来就比较困难了,因为你要仔细思考你的实现,然后想到可能会内存泄露的地方,然后一一排查,还要跟踪代码,如果有测试工具帮助,会很快。如果是单纯的内存溢出,那就比较简单了,因为肯定会有个数据爆发的需求,哪个模块实现的这种需求,针对情况调整就可以了。
      

  2.   

    这个可以用jprofile6快速查出来,jprofile可以把各个对象的引用数量及引用关系罗列出来,可以根据这个来检查出哪里泄漏了。谢谢  我是求分的  急用