jvm垃圾回收的過程


垃圾回收的過程分為兩步:

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中實現了多種垃圾回收器,在另外的博客中會提及


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM