GC判斷哪些內存需要回收
GC的問題,主要分為:1、哪些內存需要回收?2、什麽時候回收?3、如何回收?這裏主要講第一個問題。
1、哪些內存需要回收?
垃圾收集器在對堆進行回收前,第一件事情就是要確定這些對象之中哪些還“存活”,哪些已經“死去”(即不可能再被任何途徑使用的對象)。
(1)引用計數算法:給對象中添加一個引用計數器,每當有一個地方引用它時,計數器值就加1;當引用失效時,計數器值就減1;任何時刻計數器為0的對象就是不可能再被使用的。實現簡單,判定效率高,但它很難解決對象之間相互循環引用的問題。因此,虛擬機也不是通過引用計數算法來判斷對象是否存活的。
(2)可達性分析算法:通過一系列的稱為“GC Roots”的對象作為起始點,從這些節點開始向下搜索,搜索走過的路徑稱為引用鏈,當一個對象到GC Roots沒有任何引用鏈相連(即不可達),則證明此對象是不可用的。
可作為GC Roots的對象包括下面幾種:
虛擬機棧中引用的對象;方法去中類靜態屬性引用的對象;方法區中常量引用的對象;本地方法中Native方法引用的對象。
判斷對象是否存活都與“引用”有關,Java中又加入了一些更富表達意義的引用概念:強引用,軟引用,弱引用和虛引用,依次來判定一個對象是否可以被回收。
強引用:類似Object obj = new Object();只要強引用還在,就永遠不會被回收。
軟引用:用來描述一些還有用但非必須的對象。對於軟引用關聯的對象,在系統將要發生內存溢出異常之前,會把這些對象列進回收範圍之中進行第二次回收。
弱引用:也是描述一些還有用但非必須的對象,比軟引用強度更弱,被弱引用關聯的對象,只能生存到下一次垃圾收集發生之前。
虛引用:為一個對象設置虛引用的唯一目的就是能在這個對象被收集器回收時收到一個系統通知。
GC判斷哪些內存需要回收