垃圾回收机制
这里讨论Java的垃圾回收机制,也就是Java管理使用内存的机制。当对象在内存中创建以后,如果你的程序使用完毕了该对象,通常都应该回收这个对象所占用的内存空间。在C 和C++语言中,一般都靠程序员在代码中手工编写代码来处理这个过程。而Java语言则通过它的JVM(Java虚拟机)使用一种称作mark-sweep的垃圾回收机制来自动处理这一过程。
6.1 垃圾回收机制
内存空间是计算机最基本、最重要的资源。对内存空间的耗费最主要的就是创建对象。当我们不再需要使用创建的对象时,就需要释放分配给对象的内存,回收资源。Java使用一种称为“堆heap”的结构来管理内存,它使用垃圾回收机制来保证始终有足够的内存分配给创建的对象。这一内存管理机制通常是系统自动进行,不受程序员干预的。这也就减轻了程序员的工作负担。
在回收内存空间中,系统主要使用一种称作标记-清理(mark-sweep)的机制。首先,系统遍历所有对象的引用指针,如果发现有对象没有被引用,那么就把它标记为未使用。然后,系统把所有的凡是标记了未使用状态的对象进行清理回收。即使是对于那种两个未使用的对象互相引用的情况,系统通过的遍历算法也可以发现,所以这一机制是十分有效的。
另外需要注意的是,回收处理是周期性的运行,它由系统自行控制。它可能延迟任意长的时间来运行回收器,也可能在任意时候运行。所以这就可能在运行的时候出现一些问题,比如程序会暂停或者运行速度减慢。
针对这样的回收机制,我们在程序中可以显式的使用一些方法来告诉系统回收我们不需要的对象,提高回收执行的效率。比如,把不再需要使用的对象置为null,或者赋给其他对象类型变量,使其不引用指向原对象。
6.2 手工干预回收
对于回收机制,都是由系统自行完成,通常我们并不需要关心。但有时候也可以使用一些手段来手工干预内存空间的回收。
Java提供一个java.lang包中的Runtime类来做这样的工作。我们使用Runtime类的gc()方法来运行垃圾回收器,强制内存空间回收。需要注意的是使用这个方法只是给系统发出一个要求,而不是命令,所以并不能保证一定完成你指定的工作,达到你满意的效果。 另外还需要注意的是Runtime类没有构造函数,你需要使用其getRuntime()来实例化它。
有时候当撤消一个对象的时候,需要完成一些操作,来回收一些非Java的资源。对处理这样的情况,Java提供了一种被称为收尾(finalization)的机制,你可以采用与C语言类似的方式来手工回收一些资源。
要实现这一机制,只需要在你需要回收的类中定义finalize()方法即可。Java回收该类的一个对象时就会调用这个方法。在finalize()方法中你需要指定一个对象被撤消前必须执行的操作。
finalize()方法的通用格式如下:
protected void finalize ()
{
// finalization code here
}
阅读(1610) | 评论(0) | 转发(0) |