垃圾回收的過程分為兩步:
1.判斷對象是否死亡
(1)引用計數器法:
①每當有一個對象引用是,計數器加一,當計數器為0是對象死亡
②缺點:無法解決循環引用的問題,假設A引用B,B引用A,那么這兩個對象將不會被回收,造成內存泄漏
(2)可達性算法分析
①通過一系列可作為GC Roots的節點為起始點,從這些節點開始往下搜索,所走過的路徑稱為引用鏈。
②當一個對象到GC Roots節點沒有引用鏈時,說明對象不可用
③可作為GC Roots節點的對象
虛擬機棧中引用的對象
本地方法棧中引用的對象
方法區中靜態變量引用的對象
方法區中常量引用的對象
2.垃圾回收算法進行回收
(1)標記-清除:即直接將標記為死亡的對象清除,缺點是會產生垃圾碎片
(2)標記-整理:即將可用的對象同意向一端移動,將邊界外的對象清除
(3)復制算法:即將堆分為了Eden,SurvivorFrom,SurvivorTo空間
①每次在Eden空間上分配對象
②SurvivorFrom空間為上次垃圾回收是還存活的對象
③SurvivorTo空間為本次垃圾回收是生存的對象存放的位置
④本次垃圾回收結束后交換SurvivorFrom與SurvivorTo
⑤復制算法需要擔保空間,當有一個大的對象要分配,而Eden空間又不足時會直接分配到老年代
⑥在對象生存率較高時會進行大量的復制操作,降低效率
(4)分代回收算法:根據新生代與老年代對象的特點而使用不同的垃圾會回收算法
①新生代:對象生存周期較短,只有少量的生存對象,適合使用復制算法
②老年代:對象生存周期較長,只又少量需要回收的對象,且無擔保空間,所以使用標記-整理算法或者是標記-清除算法
3.根據不同的垃圾回收算法在Jvm中實現了多種垃圾回收器,在另外的博客中會提及