什么时候执行GC
- 当新生代满了的时候触发minor GC
- 当上升到老年代的对象大于剩余空间的时候执行Full GC。
- 当GC与非GC的耗时超过了GCTimeRate的时候会促发OOM
- 程序员不能控制具体的GC时间,只能调用System.gc()提示系统进行GC处理,但是JVM不一定执行。
回收什么对象
- 在引用技术算法里面,当对象超出了作用域或者对象的引用技术为0时,该对象为垃圾对象。
- 在GC Root算法里面,从GC root开始向下遍历,仍无法搜索到的对象,而且经过依次标记清理依然无法恢复的对象。
做些什么
- 运行默认的finalize函数,对对象做最后的标记处理。
- 删除垃圾对象,回收内存空间。
- 在新生代里面,我们使用复制清理算法;在老年代里面,我们使用标记清理算法。
如何延迟对象回收或保留对象
- 增大survivor space、老年代空间。
- 为引用为0的对象增加老年代对他的引用。
- 增大GcTimeRatio,低促发GC的比率。