回覆列表
-
1 # SR小壁虎
-
2 # 一隻迷茫的打工仔
計數器法特麼的逗我呢?兩個相互呼叫的物件怎麼回收?
正確答案,根搜尋演算法,具體的自己看書,搜尋出來的物件在看是否可以finalize,才能判斷一個物件是否死亡,給大家推薦一本書,深入理解java虛擬機器,好好看看
計數器法特麼的逗我呢?兩個相互呼叫的物件怎麼回收?
正確答案,根搜尋演算法,具體的自己看書,搜尋出來的物件在看是否可以finalize,才能判斷一個物件是否死亡,給大家推薦一本書,深入理解java虛擬機器,好好看看
1、引用計數演算法
在物件中新增引用計數器,每當有地方引用此物件時,計數器+1;當引用失效是-1;當計數器為0是物件就不可能再被引用。
優點:引用計數演算法實現簡單,判斷效率高。注:在java虛擬機器裡面沒有選用引用計數演算法來管理記憶體的,主要是因為它無法解決物件之間的相互迴圈引用問題。
例如:Object obj = null;
public void t(){
Test t1 = new Test();
Test t2 = new Test();
t1 .obj = t2;
t2 .obj = t1;
}
2、可達性分析演算法
基本思路為透過稱為“GC Roots”的物件作為起始點,從這些起始點向下搜尋,搜尋所走過的路徑(引用鏈),當一個物件到GC Roots沒有任何引用鏈相連時,則證明此物件是不可用的。如圖:
Java中,可作為GC Roots的物件包括:
①虛擬機器棧中引用物件。
②方法區中靜態屬性引用的物件
④本地方法棧中JNI引用的物件。
3、物件引用
①強引用:如:Object obj = new Object();只要強引用還在,垃圾收集器永遠不會回收掉被引用的物件。
②軟引用:是用來描述一些還有用但並非必須的物件。軟引用關聯的物件在系統將要發生記憶體溢位之前,將會把這些物件列進回收範圍進行二次回收。如果回收後還沒有足夠的記憶體,才會丟擲記憶體溢位異常。
④虛引用:也被稱為幽靈引用或Phantom引用,它是最弱的引用關係。一個物件是否有虛引用存在,完全不會對其生成時間構成影響,也無法透過虛擬引用來獲取一個物件例項。