内存溢出是指向JVM申请内存空间时没有足够的可用内存了,就会抛出OOM即内存溢出。内存泄漏是指,向JVM申请了一块内存空间,使用完后没有释放,由于没有释放,这块内存区域其他类加载的时候无法申请,同时当前类又没有这块内存空间的内存地址了也无法使用,相当于丢了一块内存,这就是内存泄漏,值得注意的是内存泄漏最终会导致内存溢出,很好理解,内存丢了很多最后当然内存不够用了。C++比较容易内存泄漏,因为C++编程中每申请一块内存空间后要手动delete掉,而JAVA有垃圾回收机制,大部分情况下不用手动去释放内存,所以JAVA出现内存泄漏的情况比较少,一般JAVA出现内存泄漏都是因为阻碍了GC而造成的。
总结一下JAVA比较容易出现内存泄漏的几种情况:
1.非静态内部类的静态实例
非静态内部类可能会有外围类的引用,如果它的实例是静态的,即加载该外围类的时候就会去实例化这个非静态内部类,那么这个外围类会一直被引用,GC永远不会去回收它,这个是最危险的。
2.数据库连接,IO连接,socket连接等未关闭,会一直占用内存,如果这些连接没有复用的话就造成了内存泄漏。
有一个误区,内存泄漏不是所谓的内存浪费,内存浪费意思是该内存空间虽然不用,但是需要用的时候还可以找到其内存地址。而内存泄漏是指占着内存空间却找不到内存地址了。