正 文

怎样处理Java最终化的内存保留问题


www.7dspace.com  更新日期:2006-3-1 5:52:10  七度空间


  三、保护用户免于内存保留问题

  前一节描述了在用使用终结器的第三方类工作时怎样避免内存保留问题。本节将描述怎样创建需要最后清理的类,这样以来它们的用户就不会遇到前面所概括的问题。为此,最好的方法是把这样的类分解为两个(一个持有需要最后清理的数据,另一个持有其它一切)并且只在前者上定义一个终结器。下面的代码展示了这一技术:

final class NativeImage2 {
 private int nativeImg;//指向本地图像数据
 //它释放本地图像;随后对它的调用将被忽略
 private native void disposeNative();
 void dispose() { disposeNative(); }
 protected void finalize() { dispose(); }
}
public class Image2 {
 private NativeImage2 nativeImg;
 private Point pos;
 private Dimension dim;
 public void dispose() { nativeImg.dispose(); }
}


图5.当Image2实例成为不可达时,只有NativeImage2实例将会排队

  Image2相似于Image1,但是它的nativeImg字段被包含在一个独立的类NativeImage2中。所有从图像类到nativeImg 的存取必须经由一个重定向层。然而,当一个Image2实例成为不可达的时候,只有NativeImage2实例将排队等待最终化;任何其它从 Image2实例可达的都将被提示回收(见图5)。类NativeImage2被声明为final,这样用户就不可能把它子类化并且重新引入了前一节所描述的内存保留问题。

  一处微妙的地方在于,NativeImage2不应该成为一个Image2的内部类。内部类的实例都有一个到创建它们的外部类的实例的隐含参考。所以,如果NativeImage2是Image2的一个内部类,并且一个NativeImage2实例在排队等待最终化,它应该保留相应的Image2实例,这恰恰是前面你尽力想避免的。然而,假定NativeImage2类只能从Image2类中进行存取。这就是为什么它没有公共方法的原因(它的dispose()方法,以及类本身都是为包所私有的)。
4页,页码:[1] [2] [3] [4] 

上一篇:超强恶搞 玩不崩溃的Firefox
下一篇:CorelDRAW制作胶片底片相框
怎样处理Java最终化的内存保留问题 作者:朱先忠编译 来源:天极网
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐