開始這一章節以前先問本身幾個問題:咱們爲何要學習這一章節?知道了GC 有什麼好處?python
垃圾回收:
在將來的JDK中可能G1會爲ZGC所取代算法
標記&清除ide
Java已經擯棄了這種算法,由於此算法須要的額外處理過多工具
【優】效率高,python也在用,就像論文的引用因子同樣,沒有用的文章就應該多多回收,清理學術垃圾。
【缺】沒法處理對象的相互「循環引用」,一旦造成了引用環,就沒有辦法去解決。進而形成內存泄漏。學習
GC Roots = 起始節點集,從GC Roots開始向下搜索,鏈接的路徑爲引用鏈,GC Roots不可達的對象被判爲不可用。優化
哪些是GC Roots?指針
【優】解決了循環引用的缺點
【缺】須要遍歷對象
標記清除算法
複製算法
標記清除整理算法繼承
先mark可達對象,從根節點開始進行線性遍歷。
【優】夠平均
【缺】效率不高,GC的時候致使STW,清楚後存在內存碎片(會存在一個空閒列表)進程
這是最快的清除算法
先把空間分爲兩個部分,把標記的對象規整地移到另外一個空間中(指針碰撞的方式)
【優】高效,無需mark/sweep;沒有內存碎片;
【缺】犧牲了大量的空間,」最好大家所有是垃圾!「
在標記以後清除完了再進行整理,屬於標記清除算法的優化版,無空閒列表
【優】無空閒列表,無內存碎片;空間開銷低
【缺】時間慢,須要進行屢次操做。
finalize是給GC調用的
【問】回收的時候會涉及到哪些操做?會伴隨着什麼狀態?
Memory Analyzer Tools 內存分析工具
分析dump文件:根據GC Roots去溯源,監控內存泄漏→ JProfiler
將堆空間分紅小空間是爲了下降停頓時間,下降延遲
實際的使用都是複合算法。
final是寫死的,不能繼承也不能作任何修改;
Serializable修飾是跨進程
Comparable可比較的