判断对象存活状态
1.引用计数法
当有一个地方引用A对象,则A对象计数器+1,当引用失效时,则A对象计数器-1。
优点:实现简单,判断效率高。
缺点:很难解决循环引用。
2.可达性分析算法
GCRoots,遍历,不在树内的可回收。
可以作为GCRoots的有:
虚拟机栈(本地变量表local variable)中引用的对象
方法区中类静态引用的对象
方法区中常量引用的对象
本地方法栈中NATIVE方法引用的对象
引用状态
强引用>软引用>弱引用>虚引用
对象是否应该进行回收判断策略
gc对象判断死亡过程.jpg回收方法区
使用场景:大量使用反射、动态代理、GCLib等byteCode框架;动态生成JSP及OSGi频繁自定义ClassLoader
1.该类所有实例已被回收,及堆中不存在该类的任何实例。
2.加载该类的ClassLoader已被回收
3.该类对应的java.lang.class对象没有被任何地方引用,无法在任何地方通过反射访问该类方法
垃圾收集方法
1.标记-清除算法
不足:标记及清除,效率不高;易造成空间碎片化。
2.标记-复制算法
新生代中的对象朝生夕死,所以分为eden:survivor1:survivor2 8:1:1,当survivor2空间不够时,老年代进行分配担保
3.标记-整理算法
用于老年代
4.分代搜集算法
新生代:标记-复制算法(少量存活)
老年代:标记-清除算法、标记-整理算法(大量存活)
5.HOTSPOT算法
枚举根节点,OopMap里记录了内存[偏移量]=数据类型(记录了栈上本地变量到堆上对象的引用关系,即记录了栈上代表引用的所有位置)
安全点,记录OopMap的点,只有走到安全点时,才能进行gc。分为抢先式中断及主动式中断。
安全区域(解决线程sleep、blocked状态时的gc),进入安全区域后,标记,离开安全区域时,检查是否完成gc过程
网友评论