内存溢出(out of memory)
是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;
比如堆内存是4G,程序中有大量的存活对象,即使是经过full GC(如果不明白,可以忽略)之后,仍然还有3.5G的存活对象,这时候再在执行的方法里面搞了一个1G大小的存活对象,导致堆空间无可用空间给程序使用,导致的程序崩溃现象。
内存溢出有2个主要原因:
(1)堆空间设置不合理,堆空间很小。
(2)代码中创建了大量对象,且长时间不能被垃圾收集器回收,然后又继续创建大对象。
内存泄露(memory leak)
是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。比较常见的场景是io流的close关闭的资源,我们不去close,导致系统垃圾回收器无法回收资源,单例模式引用的一些对象,这些被引用的对象是无法被回收的;数据库连接,网络socket连接不关闭等等情景。
内存泄漏意味着堆的可用空间变少,增加了内存溢出的可能性。