堆内存溢出与内存泄漏

一、内存溢出

java堆内存溢出主要有如下原因

1、虚拟机堆内存设置不够

2、出现内存泄漏

3、内存中创建了大量的大对象,并且长时间不能回收。

在抛出OutOfMemoryError之前,通常垃圾收集器会被触发,在java.nio.BITs.reserveMemory()方法中调用了System.gc()。不过也有例外,如果分配一个大对象超过了堆内存大小,此时jvm判定垃圾收集器并不能解决,所以直接抛出OutOfMemoryError。

二、内存泄漏

对象不会再使用,但是GC又不能回收,此时造成内存泄漏。

堆内存溢出与内存泄漏

举例

(1)单例模式

单例的生命周期和应用程序一样长,所以单例程序下,如果持有的对外部对象的引用的话,那么这个外部对象是不能被回收的,会导致内存泄漏。

(2)提供close方法的资源未关闭

数据库连接,网络连接和io连接必须手动close,否则是不能回收的