什麼是垃圾java
系統沒有被使用的無用對象或者一組循環引用對象python
如何找到垃圾算法
引用計數併發
對引用進行計數,沒法解決循環引用問題(java裏已經拋棄了這種算法,python如今垃圾回收用的仍是引用計數)app
根可達算法ide
根對象有哪些?spa
線程棧變量線程
靜態變量指針
常量池orm
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 算法。原理以下,
首先建立三個集合:白、灰、黑。
將全部對象放入白色集合中。
而後從根節點開始遍歷全部對象(注意這裏並不遞歸遍歷),把遍歷到的對象從白色集合放入灰色集合。
以後遍歷灰色集合,將灰色對象引用的對象從白色集合放入灰色集合,以後將此灰色對象放入黑色集合
重複 4 直到灰色中無任何對象
經過write-barrier檢測對象有變化,重複以上操做
收集全部白色對象(垃圾)
這個算法能夠實現 「on-the-fly」,也就是在程序執行的同時進行收集,並不須要暫停整個程序。
可是也會有一個缺陷,可能程序中的垃圾產生的速度會大於垃圾收集的速度,這樣會致使程序中的垃圾愈來愈多沒法被收集掉。