关于GC

本文深入探讨Java虚拟机的垃圾回收机制,介绍如何通过根搜索算法识别不再使用的对象,并详细解释对象可达性分析的过程及四种不同类型的引用。同时,文章还讨论了对象如何通过finalize()方法自救的机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《深入理解Java虚拟机》真的是看多少遍都不多,每次都有新体会
堆中存放着许多对象实例,许多是已经不用的(或者称死亡的),不清理它太占内存,垃圾回收器就是回收这些对象,释放对象所占的内存。

怎么判断对象已死呢?
2种方法:
1,引用计数法:(解决不了相互引用的问题,已经咋不用了)
2,根搜索算法
堆内存就像一颗大树,树根叫GC root,根搜索算法就是,以树根为起点开始搜索,搜索走过的路径叫引用链(相当于树枝),当一个对象没有被任何引用链相连,属于树外的东西,这个对象是不可达的;
树根是什么东西呢?
虚拟机栈引用的对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法栈中JNI引用的对象
再说说引用(4类):
强引用:只要引用还在,无论如何不会被回收的引用
软引用:当内存不够时会被考虑回收
弱引用:只能存活到下次回收之前
虚引用:如同虚设,目的只是希望,在回收的时候,给系统一个通知

接下来开始回收:
找到了不可达对象后
1.筛选:筛选条件是,对象是否覆盖finalize()方法,并且之前没有被调用过,将筛选出来的对象放到F-Queue队列里,并稍后由虚拟机自动建立的一个低优先级的线程执行,
2.标记:若将死对象在finalize()方法中,将自己与引用链上的任何一个对象建立了关联,成功解救了自己,将它标记并移出这个将死集合
重点!对象只可能逃脱一次,当第二次发现它是个不可达对象的时候,以为他的finalize()方法已经被执行过一次了,finalize()方法不会再被执行!

自己的理解,有不对的欢迎指出!一起进步~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值