天天看點

java虛拟機回收算法_Java虛拟機垃圾回收機制及算法

誰需要回收?

1. 引用計數算法

給對象添加一個引用計數器,每當對象被引用一次時計數器加1,引用時效時計數器減1,當計數器中為0時回收對象。

2. 可答性分析算法

對象和一個稱為“GC Roots”的對象相連或間接相連作為對象被引用的辨別,當對象到“GC Roots”不可達時回收對象。“GC Roots”在JVM中有很多個,包括虛拟機棧中引用的對象,方法區中類靜态屬性引用的對象,方法去中常量引用的對象,本地方法棧中JNI引用的對象。Java中引用有4種,從強到弱依次是強引用,軟引用,弱引用,虛引用。

強引用是指普遍存在的,隻要存在強引用是不會回收被引用的對象的軟引用是指還有用但并非必須的對象,當系統記憶體不夠時會回收弱引用是指非必須的對象,下一次垃圾回收時會清除虛引用是最弱的一種引用關系,無法通過虛引用來取得一個對象執行個體,唯一目的就是這個對象再被回收時能收到一個系統通知

什麼時候回收?

1. Minor GC

當新生代空間不足時觸發

2. Full GC

當調用System.gc()函數時觸發老年代空間不足時觸發方法區空間不足時觸發

這問題針對不同的垃圾回收器不同,我們明天繼續學習

如何回收?

1. 标記清理算法

java虛拟機回收算法_Java虛拟機垃圾回收機制及算法

标記清理算法

首先标記出所有需要回收的對象,在标記完成後統一回收被标記對象。

缺點:

标記和清理兩個過程效率都不高清除之後産生大量不連續的記憶體碎片,空間碎片太多導緻下次建立對象時可能由于配置設定不到足夠連續空間而觸發垃圾回收

2. 複制算法

java虛拟機回收算法_Java虛拟機垃圾回收機制及算法

複制算法

将可用記憶體按容量劃分成大小相等的兩塊A和B,先隻使用A,當A記憶體用完時,把A中存活的對象複制到B中,然後一次性将A清理。

優點:

一次清除效率高不産生記憶體碎片 缺點:可使用記憶體隻是原有記憶體的一半當對象存活率較高,進行複制操作時,效率很低

3. 标記整理算法

java虛拟機回收算法_Java虛拟機垃圾回收機制及算法

标記整理算法

将存活的對象統一向同一端移動,然後清除端邊界以外記憶體。

4. 分代收集算法

java虛拟機回收算法_Java虛拟機垃圾回收機制及算法

分代收集算法

把Java堆分成新生代和老年代。在新生代中,每次垃圾收集都能發現大量對象死去,隻有少量存活,是以使用複制算法。在老年代中,對象的存活率高,可以使用标記清理或者标記整理。