Vector v = new Vector( 10 );
for ( int i = 1 ;i < 100 ; i ++ ){
Object o = new Object();
v.add(o);
o = null ;
}
在這個例子中,代碼棧中存在Vector 對象的引用 v 和 Object 對象的引用 o 。
在 For 循環中,我們不斷的生成新的對象,然后將其添加到 Vector 對象中,之后將 o 引用置空。問題是當 o 引用被置空后,
如果發生 GC ,
我們創建的 Object 對象是否能夠被 GC 回收呢?
答案是否定的。
因為, GC 在跟蹤代碼棧中的引用時,
會發現 v 引用,而繼續往下跟蹤,就會發現 v 引用指向的內存空間中又存在指向 Object 對象的引用。也就是說盡管 o 引用已經被置空,
但是 Object 對象仍然存在其他的引用,是可以被訪問到的,所以 GC 無法將其釋放掉。
如果在此循環之后, Object 對象對程序已經沒有任何作用,
那么我們就認為此 Java 程序發生了內存泄漏。
