網上遇到一個關於java回收問題的思路

廢話很少說,如下附代碼:java

import java.util.Iterator;
import java.util.Vector;jvm

public class Test {
    int i;指針

    public static void main(String[] args) {
        Vector v = new Vector(10);
        for (int i = 1; i < 100; i++) {
            Test o = new Test();
            o.i = 11;
            v.add(o);//
            o.i = 10;
            o = null;
            //只是將對象指針設置爲null,由於vector集合強引用了可是o指向的內存沒有被回收,其實至關於new的o對象一直保持着集合裏面有個指針指向了這個對象的內存空間
            if(o!=null){
                System.out.println("o.i=="+o.i);
            }
        }
        Iterator<Object> i = v.iterator();
        while (i.hasNext()) {
            System.out.println(String.valueOf(((Test) i.next()).i));
        }
    }
}對象

這兒打印的值:生命週期

10內存

10虛擬機

....it

在網上看到這個別人提問題後,本身回想了下java的回收,將對象置於null,其實只是建議咱們的jvm虛擬機若是沒有其餘對象強引用它,它將會被jvm回收。class

這兒問題import

 o = null;

可是o給裝在了集合,其實集合裏面也會有有一個對應地址,或者說指針,可能說的不太嚴格,指向了這個內存,因此這時候jvm是不會回收對象o,只是o這個存在棧裏面的變量可能會很快被回收。

因此打印出來的值 對象的i值必定是存在的。

從另外個角度說,集合的生命週期比裝在集合裏面的對象obj生命週期長,只有集合被置爲null,被回收後,裏面的對象纔會真正被回收。

很小的問題,不過對於咱們理解java的強應用和回收問題是有收穫的。

有什麼說的不對的問題,還請各位看官多多提問。

相關文章
相關標籤/搜索