GC,Reference,Finalize,Dispose

本文详细介绍了Java垃圾回收机制的工作原理,包括不同类型的可达性引用(强引用、软引用、弱引用、幽灵引用),以及如何通过Finalize方法和Dispose模式来释放不再使用的对象资源。
GC,Reference,Finalize,Dispose

Java提供了垃圾对象自动回收(GC)机制,该机制对堆heap里的对象就其被引用情况进行跟踪判断,对合适对象进行自动回收释放内存。按java规范,对象分如下引用情况:

An object is strongly reachable if it can be reached by some thread without traversing any reference objects. A newly-created object is strongly reachable by the thread that created it.
An object is softly reachable if it is not strongly reachable but can be reached by traversing a soft reference.
An object is weakly reachable if it is neither strongly nor softly reachable but can be reached by traversing a weak reference. When the weak references to a weakly-reachable object are cleared, the object becomes eligible for finalization.
An object is phantom reachable if it is neither strongly, softly, nor weakly reachable, it has been finalized, and some phantom reference refers to it.
Finally, an object is unreachable, and therefore eligible for reclamation, when it is not reachable in any of the above ways.
根据引用情况不同,GC处理过程也不同。

当一个对象实例不被强引用strongly reachable时,GC的某次运行就有可能扫描到该对象。这时GC会检查该对象是否softreference reachable,如果是,则尽可能放它一马,一笑而过,但如果放过去就会引起out of memory error,则就要处理该对象。处理过程首先要检查是否实现了finalize方法的对象,如果是则标记finalizable,并导致Finalizer系统线程(setDaemon(true),Thread.MAX_PRIORITY - 2)在后续巡检中对此对象调用finalize方法。执行完finalize方法后如果在此后某次的GC运行中再次被发现softreference reachable,则此时导致clear softreference,并释放内存,最后归到softreference-queue中。

如果本对象没有实现finalize方法,则GC省去其对应处理环节。

此过程同样适用于weakreference reachable,所不同的是GC将不会尽可能放过该对象。

对于PhantomReference reachable,情况不同之处在于PhantomReference reachable定义在finalize已经执行结束后的GC的某次运行时,这个时候,它不去PhantomReference clear,也不释放内存,而是直接归到PhantomReference-queue中,此后需要应用程序自行clear才能释放,这也是PhantomReference一定要求queue的原因。

基于此GC机制,对“实现当不使用某对象时释放其附属资源”这样的需求,java提供两种实现方式。

Finalize方式就是指Object class的那个Finalize方法,可以被任何class进行override来实现释放对应附属资源。由于历史原因,执行该finalize方法的Finalizer线程保留为一个低优先级线程,因此导致获得巡检机会从而进行资源释放将不是十分及时;另外,java规范允许在finalize方法中再次使该对象恢复强引用,因而GC总是在执行finalize后的再次运行中才考虑释放该对象的内存,如果该对象本身占用内存比较大,这样同样导致整体资源释放将不是十分及时。最后,如果一个class实现了finalize方法,不仅如上所述释放其实例时比较占用机器资源,建立实例的过程也将因要通过必须的finalize方法检测及底层register而占用额外的资源。为此,java提供了Dispose模式可以用来替代finalize模式。

Dispose方式的实现就不在class里实现finalize方法了。在jre中,已经为java2D的支持实现了一个Disposer用来帮助释放对象附用的图形资源,下面以此为例说明Dispose方式。

sun.java2d.Dispose随着类加载初始化构建一个Java2D Disposer线程(setDaemon(true),Thread.MAX_PRIORITY),同时该类对外提供public static addRecord(Object target, DisposerRecord rec)用来建立对指定target的weakreference或 PhantomReference(系统属性sun.java2d.reftype指定)监测。当指定对象target失去强引用而成为weakreference或PhantomReference reachable时,会被GC及时置入reference-queue中,同时被高优先级的本Java2D Disposer线程及时监测到,然后本线程会去从reference-queue中拿到此reference,并通过内部映射表hashtable找到当初addRecord时传入的DisposerRecord,并调用其dispose()。所以在该dispose方法中实现释放附属资源的逻辑就可以了。
源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值