使用Java引用对象有效地管理内存

ZDNet软件频道 时间:2003-04-25 作者:翻译:Java研究组织-郭晓刚 |  我要评论()
本文关键词:
如果让一个Java程序员说出Java语言的四个最好的特性,很可能他会提到自动垃圾收集——JVM检测不再使用的对象并收回其内存的过程。
本文译自Builder.com,未经许可请勿转载如果让一个Java程序员说出Java语言的四个最好的特性,很可能他会提到自动垃圾收集——JVM检测不再使用的对象并收回其内存的过程。Java的垃圾收集机制排除了许多与内存管理有关的常见错误的潜在可能,而这些错误通常是严重且难以修正的。访问已被释放的对象或者释放不再使用的对象时失败都是Java程序员可以不用关心的问题。

但反过来说,自动垃圾收集剥夺了程序员的一些自由,因为不可能知道一个特定的对象何时将被回收,也不能对内存管理进行控制。在Java1.2中,加入了一种新类型的对象,叫做引用对象(reference object),提供了一个绕过上述限制的途径。在我开始讨论这些引用对象前,我们先学习一下Java垃圾收集的过程。

Java的垃圾收集

简单来讲,垃圾收集是释放不再被程序使用的内存的过程——清除垃圾,如果你希望的话。垃圾收集器(garbage collector)是Java中承担此职责的实体。当一个对象不再被程序使用时,它将此对象视为垃圾。

垃圾收集器怎样做出这种判断呢?正式来讲,不使用的对象指的是所有从任意活动线程,直接或间接,都不可达的对象。满足此条件的对象都将被收集,它们的内存将被回收并释放。

垃圾收集在何时或如何发生都依赖于垃圾收集器的实现。有许多可接受的收集策略,Java Language Specification将策略的选择权留给了各个JVM的实现。唯一要保证的是,在回收一个对象的内存之前,必须调用此对象的finalize方法,这个方法继承自Object,如果此对象没有定义它自己的finalize方法的话。这给了对象一个机会来做一些必要的清除动作。

请查阅Java Language Specification, section 12.6以获得Java垃圾收集的正式、详尽的描述。

什么是引用对象?

引用对象是一种特殊类型的对象,用于保持对其他对象的引用,同时垃圾收集器仍然可以回收被引用对象的内存——这也被称作弱引用(weak reference)。引用对象允许程序保持对一些在必要时可被回收的对象的引用,在内存较低时将回收这些对象。

SoftReference和WeakReference类实现了引用对象,这两个类在java.lang.ref.包中。这两个类的主要区别是,垃圾收集器采用不同的算法来决定何时回收它们指向的对象。在实践中,这两个类可以相互替换,所以我将继续使用术语“引用对象”来指代两个中的任意一个。

要创建一个对象的弱引用,你要将对象传递给引用对象的构造器。一旦被创建,引用对象的弱引用是不可变的:它不能被修改,除了调用clear方法来清除此引用。

引用对象的get方法返回原来传递给引用对象构造器的对象,或者如果调用过clear方法,get方法将返回null。当一个对象仅可通过弱引用访问时,它将符合垃圾收集的条件。当垃圾收集器决定回收一个被弱引用的对象的内存时,将首先清除引用对象持有的所有指向此对象的弱引用,所以此时调用get方法将返回null,如同你自己调用了clear方法。


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134