JVM GC筆記

堆分區:全部new的對象都會存放在堆中算法

     > 新生代(Young Generation):存放生命週期短的對象,具體還分爲Eden和Survivor兩個區,其中Survivor分爲From Space和To Space;
     > 舊生代(Old Generation):存放生命週期長的對象
     > 持久代(Permenent Generation):用於存放class字節碼等

 
JVM使用的GC算法是:分代收集
     > 頻繁的收集新生代
     > 較少的收集舊生代
     > 基本不收集持久代

 
JVM的GC機制分爲:Minor GC 和 Full GC
     > Minor GC: 即普通GC,負責收集新生代裏全部對象,會把Eden裏全部活着的對象複製到Survivor裏,若是Survivor放不下,則把Survivor裏活着的對象放入舊生代裏
     > Full GC:會對新生代和舊生代進行收集,算法不一樣效率會低於GC。顯式調用System.gc()時,就是進行Full GC。
     > 觸發條件:Eden滿了觸發Minor GC;有新對象進入舊生代時,舊生代空間不足則進行Full GC

 
JVM的清理算法:
     > 引用計數法(早期JVM):JVM會爲對象的引用數進行計數,建立則添加,引用超出範圍則刪減,當計數爲0時,則能夠收集
     > 對象引用遍歷:JVM會遍歷全部根對象,根據對象圖遞歸肯定可到達對象,若是某對象實例能夠從根對象到達,則將其標記,稱爲標記對象;在執行收集階段,只須要簡單的掃描堆棧,刪除全部未標記對象便可。通常在以後還會進行壓縮,以便爲新的對象騰出空間。
  > 複製清理法

 
JVM如何清理一個對象:
     > 新生代:採用複製清理法,掃描後把可到達的對象複製到未使用的區域,如survivor裏,而後清楚Eden裏全部對象
     > 舊生代:採用標記清理而後壓縮,內容見對象引用遍歷。
     > 機制:串行和並行兩種,串行使用於單線程,單cpu;並行使用於多線程,多核cpu。
 

調優:
     >使用調優:儘早將不用的對象賦值null,而不是等到退出生命週期自動賦值;少用finalize(),會增大GC工做量;當程序等待時,手動執行system.gc();
     >虛擬機優化選項:網上查詢