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方法中实现释放附属资源的逻辑就可以了。
演示了为无线无人机电池充电设计的感应电力传输(IPT)系统 Dynamic Wireless Charging for (UAV) using Inductive Coupling 模拟了为无人机(UAV)量身定制的无线电力传输(WPT)系统。该模型演示了直流电到高频交流电的转换,通过磁共振在气隙中无线传输能量,以及整流回直流电用于电池充电。 系统拓扑包括: 输入级:使用IGBT/二极管开关连接到全桥逆变器的直流电压源(12V)。 开关控制:脉冲发生器以85 kHz(周期:1/85000秒)的开关频率运行,这是SAE J2954无线充电标准的标准频率。 耦合级:使用互感和线性变压器块来模拟具有特定耦合系数的发射(Tx)和接收(Rx)线圈。 补偿:包括串联RLC分支,用于模拟谐振补偿网络(将线圈谐到谐振频率)。 输出级:桥式整流器(基于二极管),用于将高频交流电转换回直流电,以供负载使用。 仪器:使用示波器块进行全面的电压和电流测量,用于分析输入/输出波形和效率。 模拟详细信息: 求解器:离散Tustin/向后Euler(通过powergui)。 采样时间:50e-6秒。 4.主要特点 高频逆变:模拟85 kHz下IGBT的开关瞬态。 磁耦合:模拟无人机着陆垫和机载接收器之间的松耦合行为。 Power GUI集成:用于专用电力系统离散仿真的设置。 波形分析:预配置的范围,用于查看逆变器输出电压、初级/次级电流和整流直流电压。 5.安装与使用 确保您已安装MATLAB和Simulink。 所需工具箱:必须安装Simscape Electrical(以前称为SimPowerSystems)工具箱才能运行sps_lib块。 打开文件并运行模拟。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值