1.内存泄露 (Memory Leak)
程序在申请内存后,系统无法释放已申请的内存空间,少量的内存泄露危害可以忽略,但内存泄露慢慢堆积,后果很严重,无论多少内存,迟早会被占光。
Java 内存泄漏的典型例子
Vector v = new Vector(10);
for (int i = 0; i < 100; i++) {
Object o = new Object();
v.add(o);
o = null;
}
在这个例子中,我们循环申请Object对象,并将所申请的对象放入一个 Vector 中,如果我们仅仅释放引用本身,那么 Vector 仍然引用该对象,所以这个对象对 GC 来说是不可回收的。因此,如果对象加入到Vector 后,还必须从 Vector 中删除,最简单的方法就是将 Vector 对象设置为 null。
Java内存泄漏的根本原因是什么呢?长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏,尽管短生命周期对象已经不再需要,但是因为长生命周期持有它的引用而导致不能被回收,这就是Java中内存泄漏的发生场景。
2.内存溢出 (OutOfMemory)
程序在申请内存时,系统没有足够的空间分配。也就是,分配的内存超出了系统能给的,因此产生溢出。
3.
内存泄漏最终会导致内存溢出。