内存溢出和内存泄露

内存溢出

内存溢出是相对于内存泄露来说的,尽管这样更容易理解,但是同样的,内存溢出也是引发程序奔溃的罪魁祸首之一。

就是内存不够用

由于GC一直发展,所以一般情况下,除非应用程序占用的内存增长速度非常快,造成垃圾回收已经跟不上内存消耗的速度,否则是不太容易出现OOM (OutofMemoryError)的情况。

大多数情况下,GC会进行年龄段的垃圾回收,实在不行就来一次独占式的Full GC的操作,这时候就会回收大量的内存,供应运程序继续使用。

javadoc中对OutifMemoryError的解释是,没有空闲内存,并且垃圾收集器也无法提供更多的内存。

内存泄露

内存泄露也叫做“存储渗漏”。严格的来说,只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄露。

但实际的情况很多时候一些不太好的实践(或疏忽)会导致对象的生命周期变得很长甚至导致OOM,也可以叫做宽泛意义上的“内存泄露”。

尽管内存泄露并不会立刻导致程序的崩溃,但是一旦发生内存泄露,程序中的可用内存就会被逐步蚕食,直至内存耗尽所有,最终出现OutofMemory异常,最终到时程序奔溃。

注意,在这里的存储空间并不是指物理内存,而是指虚拟内存的大小,这个虚拟内存大小取决于磁盘交换区设定的大小。

例如:

  1. 与数据库连接完毕之后,需要关闭连接的通道,但是没有关闭。
  2. IO读写完成后没有关闭
  3. 单例模式:单例的生命周期和应用程序一样长,所以在单例程序中,如果持有对外部对象的引用的话,那么这个外部对象是不能被回收的,则会导致内存泄露的产生。
  4. 一些提供close()的资源 未关闭导致内存泄露。
  5. 数据库连接dataSourse.getConnection(),网络连接socket和io连接必须手动close,否则是不能被回收的。

你可能感兴趣的:(JVM,java,jvm,开发语言)