
1、在什么時候GC
? ? ? ?首先,GC堆內(nèi)存分為三部分:Young Generation,Old Generation,Permanent Generation。
? ? ? ? Young Generation 分為:Eden , Survivor1 , Survivor2, 新創(chuàng)建的對象會分配在Eden區(qū),在經(jīng)歷一次Minor GC后會被移到Survivor 1區(qū),再經(jīng)歷一次Minor GC后會被移到Survivor 2區(qū),直到升至老年代,需要注意的是,一些大對象(長字符串或數(shù)組)可能會直接存放到老年代;升到老年代的對象大于剩余空間時,會發(fā)生Full GC,或者小于時,查看是否設(shè)置了XX:+HandlePromotionFailure(允許擔(dān)保失敗)參數(shù),若允許,則只會進行Minor GC,此時可以容忍內(nèi)存分配失敗;若不允許,強制Full GC。
? ? ? ?GC與非GC時間耗時超過了GCTimeRatio的限制引發(fā)OOM,調(diào)優(yōu)諸如通過NewRatio控制新生代老年代比例,通過MaxTenuringThreshold控制進入老年前生存次數(shù)等。了解GC參數(shù),請參見另一篇文章。
2、對什么東西GC
? ? ? ?從GC root 開始搜索,搜索不到的對象和經(jīng)過第一次標(biāo)記、清理后仍舊沒復(fù)活的對象,這類對象會被GC。
3、GC做了什么事情
? ? ? ? 按照各部分的收集器進行空間回收,其中涉及到的收集器和GC算法參見另兩篇文章:
? ? ? ? 新生代做復(fù)制清理、老年代做的是標(biāo)記整理、標(biāo)記清除
參考文獻:
http://icyfenix.iteye.com/blog/715301
https://yemengying.com/2016/05/13/jvm-GC/
http://www.cnblogs.com/zhguang/p/3257367.html