对象存活判断
1.引用计数(循环引用)
2.可达性分析算法
GC Roots包括栈中本地变量、类静态属性、常量引用、native应用
3.方法区的回收(常量、类)
一个类要被回收,须满足三个条件:
1.无类的实例存活
2.加载该类的classLoader已被回收
3.类对应的Class对象未被引用
垃圾收集器
1.Serial/SerialOld
单线程复制,单线程标记-整理,client模式下很好的选择。
2.ParNew
多线程进行复制,与SerialOld、CMS组合使用
3.Parallel Scavenge
与ParNew的区别是,它是“吞吐量“优先的。
3.ParallelOld
多线程标记-整理,与Parallel Scavenge相配合
4.CMS
1.初始标记:STW,单线程标记GCRoots一步之内的对象
2.并发标记:与用户线程并发运行
3.重新标记:STW,多线程标记并发标记期间变动的对象
4.并发清理:与用户线程并发并发运行,清理
并发运行对cpu比较敏感,可能会使用户线程运行缓慢;清理的同时用户进程还在运行,所以不能等到老年代几乎被填满才开始,要预留空间给用户线程;标记-清除会导致碎片频现,所以提供了选项来启用整理配合。
内存分配与回收策略
1.minor GC与major GC(full GC)
2.大对象直接进入老年代
可以设置参数对象超过多大,就使他直接存入老年代
3.长期存活对象进入老年代
jvm为每个对象定义了age ,一个对象每经过一次minor GC仍存活其age便加一,可以设置jvm参数一个对象age达到多大即使它进入老年代。
动态对象年龄判定
相同age所有对象大小的总和超出Survivor的一半,age大于或等于该age的对象直接进入老年代
空间分配担保
minor GC后若eden区存活对象过大,无法放入Survivor,则会利用老年代空间担保,老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小,若大于进行minor GC(有风险);否则,先major GC。