java 垃圾回收之標記算法
阿新 • • 發佈:2019-04-05
執行 是否 本地方法棧 虛擬 垃圾回收機制 垃圾回收 main nbsp 循環引用
對象被判定為垃圾的標準
1、沒有被其他對象引用
判定對象是否為垃圾的算法
1、引用計數算法(不是主流垃圾回收機制)
1.1 判定對象的引用數量
1.1.1 通過判斷對象的引用數量來決定對象是否可以被回收
1.1.2 每個對象實例都有一個引用計數器,被引用則+1,完成引用則-1
1.1.3 任何引用計數為0的對象實例可以被當作垃圾收集
優點:執行效率高,程序執行受影響較小
缺點:無法檢測出循環引用的情況,導致內存泄漏(對象一直占用堆內存,沒被回收)
public class ReferenceCounterProblem {public static void main(String[] args) { MyObject object1 = new MyObject(); MyObject object2 = new MyObject(); object1.childNode = object2; object2.childNode = object1; } }
2、可達性計數算法(主流)
通過判定對象的引用鏈是否可達來決定對象是否可以被回收
---》什麽可以作為GC Root的對象?
a.虛擬機棧中引用的對象(棧幀中的本地變量表)
b.方法區中的常量引用的對象
c.方法區中的類靜態屬性引用的對象
d.本地方法棧中JNI(Native方法)的引用對象
e.活躍線程的引用對象
java 垃圾回收之標記算法