天天看點

GC算法【JVM】

JVM-GC算法

1.什麼對象是垃圾?

  • 當一個對象沒有任何引用指向他的時候他就是一個垃圾

2.GC的作用

  • GC的作用實際上很簡單就是回收沒有用的對象,實際上對象回收後會存在記憶體碎片化,這樣不連續的空間沒辦法法配置設定大對象,是以GC也有整理記憶體碎片化的作用

3.常見GC算法

3.1引用計數算法

  • 原理:給每一個對相關儲存一個被引用次數的标記值, 被引用一次改值就增加1, 這樣在GC回收的時候直接就判斷目前值是否為0即可
  • 優缺點
    • 優點:實作簡單
    • 缺點:無法解決循環引用問題
  • JDK中是否使用?
    • 沒有被采用

3.2根搜尋算法(GC Roots)

  • 原理:根搜尋算法的原理其實就是以一個集合的對象作為根,開始尋找他們引用了那些對象,能被引用到的對象就不應該被回收。
  • 那些對象可以作為GC Roots
    • 方法區/堆中的靜态常量引用的對象
    • 所有synchronized持有的對象
    • 目前虛拟機棧中引用的對象
    • 如果目前是分區回收,那麼其他區的所有對象也可以
  • JDK中采用方式
  • 注意:
    • 标記最終該對象是否為不可達,不是一次标記就能判斷的;其中還有個finalize方法可以自救

3.3标記清楚算法

  • 原理:首先會對記憶體中的對象進行标記,如果能到達的對象就标記為可達對象;然後線上性的周遊所有對象去周遊清除
  • 缺點:
    • 垃圾回收後會産生大量的記憶體碎片
    • 并且線上性周遊清楚的時候整個使用者線程也需要停止,是以效率也比較低

3.4複制算法

  • 原理:将記憶體一分為二,每次隻使用其中的一半;然後在垃圾回收時直接将使用的記憶體中的對象拷貝到另外一半記憶體,然後直接讓原本使用的記憶體全部回收
  • 優點:
    • 解決了記憶體碎片化問題
    • 實作效率比标記清楚高,以為沒有線性周遊的過程
  • 缺點:
    • 記憶體浪費比較嚴重
    • 如果存活對象很多回收對象很少,那麼這樣複制的開銷就很大;是以這種算法不适用與垃圾對象很少的區域

3.5标記壓縮算法

  • 原理:在标記清楚之上進行了記憶體整理,将所有的對象移動到記憶體的一端
  • 優點:
    • 解決了記憶體浪費問題
    • 解決了記憶體碎片化問題
  • 缺點:
    • 效率比标記清楚算法更低

3.6 分代算法

  • 以上幾種算法都有各自的不同應用場景,比如複制算法就比較适合存活對象少的區域,那麼在新生代使用複制算法就比較好,而标記整理算法就比較适合用在存活對象多的老年代