2.垃圾回收过程及算法

判断对象存活状态

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.标记-清除算法
不足:标记及清除,效率不高;易造成空间碎片化。

标记-回收.png

2.标记-复制算法
新生代中的对象朝生夕死,所以分为eden:survivor1:survivor2 8:1:1,当survivor2空间不够时,老年代进行分配担保

image.png

3.标记-整理算法
用于老年代

4.分代搜集算法
新生代:标记-复制算法(少量存活)
老年代:标记-清除算法、标记-整理算法(大量存活)

5.HOTSPOT算法
枚举根节点,OopMap里记录了内存[偏移量]=数据类型(记录了栈上本地变量到堆上对象的引用关系,即记录了栈上代表引用的所有位置)
安全点,记录OopMap的点,只有走到安全点时,才能进行gc。分为抢先式中断及主动式中断。
安全区域(解决线程sleep、blocked状态时的gc),进入安全区域后,标记,离开安全区域时,检查是否完成gc过程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容