第三章垃圾收集器與內存分配策略
阿新 • • 發佈:2018-11-28
永久代 調用 標記清理 參數 通過 大小 整合 虛擬機 分析
3.2對象死亡的判斷方法
3.2.1引用計數法
給對象添加一個引用計數器,每當一個地方引用它就+1,引用失效就-1,當計數器為0時就表示對象已經死亡。
缺點是無法解決循環引用問題
3.2.2可達性分析
將GC root作為根節點向下遍歷,無法遍歷到的對象(GC Root到這個對象不可達)就表示該對象已經死亡。
3.2.3對象的自救
已經死亡的對象會被第一次標記,然後進行篩選,篩選出是否有必要執行finalize()方法,如果對象有並且是第一次被調用那麽對像將被放在F-Queue隊列中,等待虛擬機觸發這個方法,如果在finalize()方法中與任何一個對象建立關聯則該對象還可以存活
3.2.4回收方法區
永久代的回收(full GCf)主要內容是:廢棄常量和無用的類
常量的回收:和堆中的對象相似,當系統中沒有String對象引用時會被回收。
無用的類必須滿足三個條件:
該類的所有實列已經被回收
1. 加載該類的classloader已經被回收
2. 該類對應的java.lang.Class對象沒有被任何地方引用,無法通過反射訪問該類
3.3垃圾回收算法
3.3.1標記-清楚算法
先將所有可回收對像進行標記然後再回收
缺點是效率低,產生的碎片多
3.3.2復制算法
將存活的對象復制到另一半內存中,當另一半內存不夠時會向永久代進行分配擔保 將堆分為了Eden From Survivor, To Survivor 默認比列是8:1:1
3.3.3分代收集算法
新生代使用復制算法 老年代使用標記清理或標記整理
3.4垃圾收集器
Serial: 最基本最悠久的,單線程,工作時會stop the world 簡單而高效 ParNew: Serial的多線程版本 Parallel Scavenge:可以控制吞吐量,和最大垃圾收集停頓時間。動態調節新生代的大小,Eden與Survivor的比列,晉升老年代對象的大小等細節參數提供最合適的停頓時間或者最大吞吐量 Serial Old:serial的老年代版本 Parallel Old:Parallel的老年代版本 CMS: 工作分為四個步驟 初始標記 並發標記 重新標記 並發清除 CMS收集器對CPU資源敏感 CMS收集器無法處理浮動的垃圾 CMS會產生很多碎片 G1:是目前的最新成果,它並行與並發 分代收集 空間整合 可預測的提頓 將java堆分為多個Region 工作步驟:初始標記,並發標記 最終標記 篩選回收
3.5內存分配與回收策略
- 對象優先在Eden分配
- 大對象直接進入老年代
- 長期存活的對象進入老年代也就是對象的年齡>=MaxTenuringThreshold設定的年齡
- 動態對象年齡:滿足同年對象達到Survivor空間的一半
第三章垃圾收集器與內存分配策略