堆分區:全部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();
>虛擬機優化選項:網上查詢