一、内存溢出
java堆内存溢出主要有如下原因
1、虚拟机堆内存设置不够
2、出现内存泄漏
3、内存中创建了大量的大对象,并且长时间不能回收。
在抛出OutOfMemoryError之前,通常垃圾收集器会被触发,在java.nio.BITs.reserveMemory()方法中调用了System.gc()。不过也有例外,如果分配一个大对象超过了堆内存大小,此时jvm判定垃圾收集器并不能解决,所以直接抛出OutOfMemoryError。
二、内存泄漏
对象不会再使用,但是GC又不能回收,此时造成内存泄漏。
举例
(1)单例模式
单例的生命周期和应用程序一样长,所以单例程序下,如果持有的对外部对象的引用的话,那么这个外部对象是不能被回收的,会导致内存泄漏。
(2)提供close方法的资源未关闭
数据库连接,网络连接和io连接必须手动close,否则是不能回收的