怎样处理Java最终化的内存保留问题
发布时间:2006-02-28 17:05:13 来源:天极开发 网友评论 0 条 三、保护用户免于内存保留问题
前一节描述了在用使用终结器的第三方类工作时怎样避免内存保留问题。本节将描述怎样创建需要最后清理的类,这样以来它们的用户就不会遇到前面所概括的问题。为此,最好的方法是把这样的类分解为两个(一个持有需要最后清理的数据,另一个持有其它一切)并且只在前者上定义一个终结器。下面的代码展示了这一技术:
| 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()方法,以及类本身都是为包所私有的)。
- 推荐阅讯
- 用J2SE1.5建立多任务的Java应用程序
- Java/XML GUI框架WidgetServer 1.0RC3发布
- Java秘史:隐藏在SWT/Swing背后的故事
- Java开源IOC容器Fuse 0.2 Final发布
- 中断Java ME手机上的屏幕保护程序
- Sun发布Beta 2测试版Java SE 6
- Java桌面应用程序设计:SWT简介(1)
- 全面理解Java中的String数据类型
- 怎样处理Java最终化的内存保留问题
- Weblogic81和Hibernate 的集成问题
- 阅读排行
- 1.Java连接SQL Server 2000
- 2.Java文件操作详解
- 3.Java控件设计入门
- 4.Java操作Excel电子表格
- 5.Java: JNI完全手册
- 6.Java命令行简介
- 7.开发J2EE应用应遵循的几点原则
- 8.Servlet与Javabean配置
- 9.Java规则引擎与其API应用详解
- 10.CLASSPATH详解
- 专题教程
- Windows Server-Windows Server文档-Windows Server新闻-Windows Ser PostgreSQL-PostgreSQL文档-PostgreSQL新闻-PostgreSQL专家
- WebLogic-WebLogic文档-WebLogic新闻-WebLogic专家 FreeBSD-FreeBSD文档-FreeBSD新闻-FreeBSD专家
- Linux-内核 GUI KDE Gnome DNS FTP 安全 安装-Linux专区 Windows-AD IIS ServerCore 虚拟化 安全 HPC-Windows专区
- 大话G游 专题:手机病毒揭密
- ARP攻击防范与解决方案 路由故障处理手册

