[總結]-第三章 垃圾收集器與內存分配策略
1、知識點
一、對象是否存活的斷定
斷定對象死亡須要通過2次標記:java
- 第一次標記:可達性分析後沒有與GC Roots相鏈接的引用鏈。
- 第二次標記:GC對F-Queue中的對象進行標記(低優先級的Finalizer線程會去執行F-Queue中對象的finalize()方法)
二、引用分類
- 強引用(Strong Reference)
- 主要強引用還在,則垃圾收集器不會回收被引用的對象。
- 軟引用(Soft Reference)
- 弱引用(Weak Reference)
- 虛引用(Phantom Reference)
三、finalize( )
- 任何一個對象的finalize()方法都只會被系統自動調用一次。(注意是對象,並非類);
- finalize()若是耗時過長,GC並不會等待。它只是通知另外一個線程(Finalizer)去執行而已;
- 知道便可,不建議使用;
四、垃圾收集算法
- 引用計數器
- 優勢:實時性,只要對象的引用計數器爲0,馬上回收;
- 缺點:互相引用就永遠沒法去除。
- 標記、清除(通常在老年代適用)
- 標記:找到全部可訪問的對象,作個標記;
- 清除:遍歷堆,把未標記的對象清除;
- 缺點:一、標記、清除效率都低;二、空間內存碎片;三、STW;
- 標記、整理(通常在老年代適用)
- 標記:找到全部可訪問的對象,作個標記;
- 整理:將存活對象向一端移動,最後清除端邊界之外的對象;
- 複製(通常在新生代適用)
- 優勢:GC時,將存活的對象複製到另一半空間中,刪除當前空間全部遺留對象便可。簡單高效。
- 缺點:須要浪費一半空間。
- 衍生:Eden(1)+ Survivor(2),默認 Eden:Survivor:Survivor = 8:1:1。
- 分代收集
- 新生代使用複製算法;
- 年老代使用標記清除或標記整理算法。
五、安全點和安全區域
六、垃圾收集器
七、新生代GC與老年代GC
只要老年代的連續空間大於新生代對象總大小或者歷次晉升的平均大小就會進行MinorGC,不然將進行FullGC。線程
八、進入老年代
-
大對象直接進入老年代對象
- -XX:PretenureSizeThreshold參數,比此值大的會直接在老年代分配。
- 目的是避免在Eden區及兩個Survivor區之間發生大量的內存複製。
-
長期存活的對象進入老年代排序
- -XX:MaxTenuringThreshold默認15,每次MinorGC後,年齡+1。
-
動態對象年齡
- 若是在Survivor空間中相同年齡全部對象大小的總和大於Survivor空間的一半,年齡大於或等於該年齡的對象就直接進入老年代。
博客
https://my.oschina.net/gmarshal
歡迎關注個人我的微信訂閱號:(聽說這個頭像程序猿專用)