GC 垃圾回收

  1. 什麼是垃圾java

系統沒有被使用的無用對象或者一組循環引用對象python

  1. 如何找到垃圾算法

  • 引用計數併發

  • 對引用進行計數,沒法解決循環引用問題(java裏已經拋棄了這種算法,python如今垃圾回收用的仍是引用計數)app

  • 根可達算法ide

根對象有哪些?spa

  1. 線程棧變量線程

  1. 靜態變量指針

  1. 常量池orm

  1. JNI指針等

圖片


垃圾回收算法

  • mark-sweep:標記清除

  • copying:拷貝

  • mark-compact:標記壓縮

標記清除:不適合伊甸區

先標記後清除,兩遍掃描,容易產生碎片,適合存活對象比較多的狀況




拷貝算法:適合伊甸區

容易形成空間浪費,移動複製對象,須要調整對象引用,適用於存活對象較少的狀況,只掃描一次,效率提升,不會形成內存碎片



標記壓縮

每次清除垃圾,都把不是垃圾的對象填充到垃圾的坑裏,這樣就不會產生碎片,但須要掃描兩次,須要移動對象,效率低一些

圖片


圖片


JVM組成

主流的hostspot的JVM是分代模型

由伊甸區 suvisor1 suvisor2 old區組成

對象出生到消亡過程;以下圖

圖片


s1 最大年齡是4位,最大數是15,因此有個對象在s1裏 被掃描了15次就會被放入到 老年代


圖片

動態年齡

  • s1 -> s2 超過50%(超過s1+s2的總和的50%)

  • 把年齡最大的放入O

分配擔保

YGC期間,suvivor區的空間不夠了,空間擔保直接進入老年代

垃圾回收器

1.8 默認用的yong是Parallel+ old Parallel (PS+PO)

下圖凡是Yong+Old 紅線能夠連在一塊兒的均可以組合。

圖片


  • Serial:串行工做,會致使STW。(stop the word),意思是serial垃圾回收的時候,別的都沒有工做了。已通過時了。

  • Parallel:多個線程並行處理GC,也會致使STW,可是比Serial效率高

  • ParNew: 由Parallel的加強版:ParNew 響應時間優先,配合CMS,線程數通常是cpu核心數

  • CMS(重點: concurrent Mark sweep,多個線程並行處理,解決(緩解)了STW問題。可是cms問題特別多,例如最嚴重的內存碎片化,若是管理大內存,碎片化問題嚴重失衡,會致使使用Serial Old去對老年代的gc順序作標記進行壓縮,致使更嚴重的STW問題。

併發標記算法:三色標記

三色掃描算法

圖片


三色標記法是傳統 Mark-Sweep 的一個改進,它是一個併發的 GC 算法。原理以下,

  1. 首先建立三個集合:白、灰、黑。

  1. 將全部對象放入白色集合中。

  1. 而後從根節點開始遍歷全部對象(注意這裏並不遞歸遍歷),把遍歷到的對象從白色集合放入灰色集合。

  1. 以後遍歷灰色集合,將灰色對象引用的對象從白色集合放入灰色集合,以後將此灰色對象放入黑色集合

  1. 重複 4 直到灰色中無任何對象

  1. 經過write-barrier檢測對象有變化,重複以上操做

  1. 收集全部白色對象(垃圾)

這個算法能夠實現 「on-the-fly」,也就是在程序執行的同時進行收集,並不須要暫停整個程序。

可是也會有一個缺陷,可能程序中的垃圾產生的速度會大於垃圾收集的速度,這樣會致使程序中的垃圾愈來愈多沒法被收集掉。

相關文章
相關標籤/搜索