内存泄漏:是泄漏的对象通过了一定得路径与GC Roots产生了关联,导致垃圾收集器无法回收这些对象。(HotSpot VM是通过可达性分析的方法来判断对象是否属于垃圾回收对象,以GC Roots为起点,不管通过什么样的路径,只要可到达的对象都认为不是垃圾对象)
内存溢出:内存中的对象确实都还必须活着,但是内存空间不足导致的,当然不是说所有的内存溢出都是硬件上内存不够的问题,
很多场景是由于不当的代码导致的,比如死循环里一直在创建对象,并且把创建的对象放入了list中(因为list一直在引用这些对象,导致GC回收不了,又由于是死循环,所以肯定会导致内存溢出的)
个人认为内存泄漏和内存泄漏重点的确认内存中的对象是否是必须活着的
如果都必须活着,导致的内存不够用那就是内存溢出
如果是通过其他你想不到的路径与GC Roots产生了关联,导致垃圾收集器无法回收这些对象的话(也就是说正常情况下你是期望这些对象不可达的,是应该被回收的,但是它却可达了,没被回收)这种情况属于内存泄漏
“如果是内存泄漏,可进一步通过工具查看泄漏对象到GC Roots的引用链。于是就能找到泄漏对象是通过怎样的路径与GC Roots相关联并导致垃圾收集器无法回收它们的。掌握了泄漏对象的类型信息及GC Roots引用链的信息,就可以比较准确地定位出泄漏代码的位置”
上述加黑字体摘抄自《深入理解Java虚拟机》
以上仅仅是个人观点