JVM之判斷對象是否存活的方法

爲什麼要判斷對象是否存活呢?

虛擬機中幾乎所有的對象都要在堆內存中分配存儲區域,而如果要進行垃圾回收就得判斷哪些對象是”死掉“的,什麼情況下可以判斷某個對象是“死掉”的呢?當然是這個對象的存在已經對程序做不了任何貢獻的時候,也就是說沒有任何對象會再使用到這個對象了。

再說一遍,判斷對象是否存活是在垃圾回收之前的一步至關重要的事情!

再說一遍,判斷對象是否存活是在垃圾回收之前的一步至關重要的事情!

再說一遍,判斷對象是否存活是在垃圾回收之前的一步至關重要的事情!

 

有兩種算法可用於判斷對象是否存活:

引用計數器算法:

    1:原理:給每個對象添加一個引用計數器,當有一個對象引用它時,就加1,當引用失效時,就減1.當任何對象的引用計數器的值爲0時,這個對象就不會在被引用,就會被判定對象已死。DEAD! DEAD! DEAD!

    2:優點:實現簡單,判定效率高

    3:缺點:很難解決對象直接循環引用的問題

潛意識告訴我這個算法應該沒什麼人會用,但其實微軟的COM技術,使用ActionScript3的FlashPlayer,Python語言和在遊戲腳本領域被廣泛使用的Squirrel都使用引用計數器算法來管理內存

 

可達性分析算法:

首先確定引用根節點,那些對象可以被認爲是引用根節點呢????

1:虛擬機棧中局部變量表中引用的對象(什麼是虛擬機棧?虛擬機棧存放線程訪問的各個方法,什麼是局部變量表?局部變量表是虛擬機棧中棧幀【方法】中定義的變量和方法間傳遞的參數)

2:本地方法棧中native方法引用的對象

3:方法區中靜態屬性引用的對象(方法區是所有線程共享的,存放各個類的信息,常量,靜態變量等)

4:方法區中常量引用的對象

 

以上面條件選區的GC根節點爲初始節點開始向下搜索,跟該節點相關的對象,會在兩者之間建立引用鏈。當其他對象跟根節點由根節點形成的引用鏈樹沒有關聯時,就可以對這些對象說拜拜

 

加一條:這些未跟GC根節點相關聯的對象,其實並不會在第一次垃圾回收的時候就被回收。會在第一次回收時打個標記,在第二次的垃圾回收時進行回收

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章