垃圾回收-如何判斷是一個垃圾

判斷垃圾-引用計數法

判斷一個對象是否存活:給這個對象增加一個引用計數器,當有一個地方引用他時就加1,當引用失效就減1,計數器爲0的對象就是可以回收的。

缺陷:很難解決對象之間循環引用的問題。如:objA.instance=objB,objB.instance=objA,除此之外這兩個對象沒有任何引用,但是因爲他們彼此引用,導致無法回收。

判斷垃圾-可達性分析算法

   找到一些gc Roots對象,然後從這些對象進行向下搜索,搜索走過的路程稱爲引用鏈,當一個對象到gc roots沒有任何引用鏈時,證明此對象是一個垃圾。

 

判斷垃圾-引用計數法

判斷一個對象是否存活:給這個對象增加一個引用計數器,當有一個地方引用他時就加1,當引用失效就減1,計數器爲0的對象就是可以回收的。

缺陷:很難解決對象之間循環引用的問題。如:objA.instance=objB,objB.instance=objA,除此之外這兩個對象沒有任何引用,但是因爲他們彼此引用,導致無法回收。

判斷垃圾-可達性分析算法

   找到一些gc Roots對象,然後從這些對象進行向下搜索,搜索走過的路程稱爲引用鏈,當一個對象到gc roots沒有任何引用鏈時,證明此對象是一個垃圾。

引用分類

     如果reference類型的數據中存儲的數值代表的是另一塊內存的起始地址,就稱這款內存代表着一個引用。一個對象在這種定義下只有被引用和沒有被引用兩種狀態。如果需要描述這樣一類對象,當內存空間足夠時,能保留在內存中,如果內存非常緊張,則可以拋棄這些對象。

以此爲背景,java對引用的概念進行了擴充,分爲強引用,軟引用,弱引用,虛引用,強度依次逐漸減弱。

強引用:類似object obj=new Obeject();這類引用,只要強引用存在,垃圾收集器就永遠不會回收掉的對象。

軟引用:用來描述一些還有用但並非必需的對象。軟引用的對象是在系統將要發生內存溢出之前,會把這些對象列進回收範圍之中進行第二次回收。

弱引用:比軟引用更弱,被弱引用關聯的對象只能生存到下一次垃圾回收之前。

虛引用:是最弱的一種引用。虛引用不會對一個對象的存活時間有任何的影響,設置虛引用的目的就是在這個對象被收集器回收的時候收到一個系統通知。

引用分類

     如果reference類型的數據中存儲的數值代表的是另一塊內存的起始地址,就稱這款內存代表着一個引用。一個對象在這種定義下只有被引用和沒有被引用兩種狀態。如果需要描述這樣一類對象,當內存空間足夠時,能保留在內存中,如果內存非常緊張,則可以拋棄這些對象。

以此爲背景,java對引用的概念進行了擴充,分爲強引用,軟引用,弱引用,虛引用,強度依次逐漸減弱。

強引用:類似object obj=new Obeject();這類引用,只要強引用存在,垃圾收集器就永遠不會回收掉的對象。

軟引用:用來描述一些還有用但並非必需的對象。軟引用的對象是在系統將要發生內存溢出之前,會把這些對象列進回收範圍之中進行第二次回收。

弱引用:比軟引用更弱,被弱引用關聯的對象只能生存到下一次垃圾回收之前。

虛引用:是最弱的一種引用。虛引用不會對一個對象的存活時間有任何的影響,設置虛引用的目的就是在這個對象被收集器回收的時候收到一個系統通知。

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