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