解析Java对象引用与JVM自动内存管理(2)
解析Java对象引用与JVM自动内存管理(2) |
作者:杨扬 本文选自:赛迪网 2002年11月22日 |
当用户打开某一web页时,applet代码获得图片并且得到显示。如果在代码中同时创建了该图片对象的soft references,那么当用户离开该web页时,内存管理器对图片所分配的内存是否回收做出选择。当用户返回该web页时,在applet代码中使用SoftReference.get方法就会得到图片才内存中是否仍存在的消息。如果在内存管理器中未创建该图片,在web页上会很快得到显示;否则,applet代码就会重新获取。 下面是Example.java的完整源代码。 import java.awt.Graphics; public void start() { public void stop() {
当内存管理器未发现strong references 和 soft references 时,我们称对象具有弱获取能力,即在到达该对象的路径中至少包含一个weak reference。程序中weak references被清除一段时间后,弱获取对象被收尾器收集。由此也可以看出,soft reference和weak reference之间的区别在于,应用soft reference时,内存管理器利用算法决定是否创建弱获取对象,而应用weak reference时,内存管理器必须创建次获取对象。
当内存管理器未发现前三种对象引用时,我们称对象具有虚获取能力,即在到达该对象的路径中至少包含一个phantom reference。虚引用对象直接被收尾器收集,而不被重新创建。当内存管理器发现只有phantom references时,对象就将处于等候phantom reference状态,应用程序向引用队列发出通知,然后对虚引用对象调用clear()方法,将其引用域设置为null,最后对不可获取对象执行收集清除处理任务。 通常,对象所具有的获取能力与引用对象集合直接路径中的最弱连接者相同。据此可以看出: 图2(a)中,虚引用对象具有强获取能力,其它对象均具虚获取能力; (b)中虚引用对象和弱引用对象均具强获取能力,故次引用对象和对象集合具有若获取能力; (c)中虚引用对象、弱引用对象和次引用对象均具强获取能力,那么对象集合则具次获取能力。
小结
● 在程序中使用引用对象API不但可以在一定程度上控制内存管理器,实现内存自动管理,还可以提高程序的稳定性和安全性。 ● 引用对象链中各个对象的获取能力与整个链相关。 (责任编辑 Sunny) |