UML软件工程组织

解析Java对象引用与JVM自动内存管理(2)
作者:杨扬 本文选自:赛迪网 2002年11月22日

Soft References 应用实例

下面以在基于web的应用程序中使用soft references为例,来说明Java对象引用与JVM的内存管理器进行交互的原理。

当用户打开某一web页时,applet代码获得图片并且得到显示。如果在代码中同时创建了该图片对象的soft references,那么当用户离开该web页时,内存管理器对图片所分配的内存是否回收做出选择。当用户返回该web页时,在applet代码中使用SoftReference.get方法就会得到图片才内存中是否仍存在的消息。如果在内存管理器中未创建该图片,在web页上会很快得到显示;否则,applet代码就会重新获取。

下面是Example.java的完整源代码。

import java.awt.Graphics;
import java.awt.Image;
import java.applet.Applet;
import java.lang.ref.SoftReference;
public class Example extends Applet {
SoftReference sr = null;
public void init() {
System.out.println("Initializing");
}
public void paint(Graphics g) {
Image im = (sr == null) ? null : (Image)(sr.get());
if (im == null) {
System.out.println("Fetching image");
im = getImage(getCodeBase(),"yundong.gif");
sr = new SoftReference(im);
}
System.out.println("Painting");
g.drawImage(im, 25, 25, this);
g.drawString("运动之美",20,20);
im = null;
/* Clear the strong reference to the image */
}

public void start() {
System.out.println("Starting");
}

public void stop() {
System.out.println("Stopping");
}
}

在上面的代码中,对象image是一个图片对象,传递给一个SoftReference对象sr。其中image对象是sr的指示对象,sr中的引用域是从次引用(soft reference)到 image。

Weak References分析

对于一个稳定的对象,比如说线程类对象,当需要获取外部数据时,在程序中应用weak references是非常理想的。如果利用引用队列创建了某一线程的weak reference,那么当线程不再具有强获取能力时,应用程序得到通知,根据此通知,应用程序才能执行相关数据对象的清除工作。

当内存管理器未发现strong references 和 soft references 时,我们称对象具有弱获取能力,即在到达该对象的路径中至少包含一个weak reference。程序中weak references被清除一段时间后,弱获取对象被收尾器收集。由此也可以看出,soft reference和weak reference之间的区别在于,应用soft reference时,内存管理器利用算法决定是否创建弱获取对象,而应用weak reference时,内存管理器必须创建次获取对象。

引用对象链

当到达某一对象的路径中含有多个引用对象时,就构成了引用对象链。内存管理器按照由强到弱的顺序处理引用对象,具体处理步骤包括:Soft references、 Weak references、Finalization、Phantom references和创建对象五个部分。

当内存管理器未发现前三种对象引用时,我们称对象具有虚获取能力,即在到达该对象的路径中至少包含一个phantom reference。虚引用对象直接被收尾器收集,而不被重新创建。当内存管理器发现只有phantom references时,对象就将处于等候phantom reference状态,应用程序向引用队列发出通知,然后对虚引用对象调用clear()方法,将其引用域设置为null,最后对不可获取对象执行收集清除处理任务。

通常,对象所具有的获取能力与引用对象集合直接路径中的最弱连接者相同。据此可以看出:

图2(a)中,虚引用对象具有强获取能力,其它对象均具虚获取能力;

(b)中虚引用对象和弱引用对象均具强获取能力,故次引用对象和对象集合具有若获取能力;

(c)中虚引用对象、弱引用对象和次引用对象均具强获取能力,那么对象集合则具次获取能力。

图2 引用对象链

小结

  • 引用对象API是Java2平台中的特色之一。
  • 在程序中使用引用对象API不但可以在一定程度上控制内存管理器,实现内存自动管理,还可以提高程序的稳定性和安全性。
  • 引用对象链中各个对象的获取能力与整个链相关。

(责任编辑 Sunny)



版权所有:UML软件工程组织