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