`

Java垃圾回收机制

    博客分类:
  • Java
 
阅读更多

Collect from "Think in Java".

 

Java有垃圾回收器(以下称为GC)来回收不用的对象占据的内存资源。但也有特殊情况:

如果你的对象(并非使用new)获得了一块“特殊”的内存,由于GC只知道释放那些经由Java new分配的内存,所以GC不知道如何释放该对象的这块“特殊”的内存。

 

为了应对这种情况,Java允许在类中定义一个finalize()方法。它的工作原理“应该”是这样的:

 

一旦GC准备好释放对象占用的内存空间,将首先调用finalize()方法,并且在下一次GC进行垃圾回收时,才会真正地回收对象所占用的内存。

但需要强调:

这歌finalize()函数并不能看做C++的析构函数,在C++中,如果程序没有错误的话,对象是一定会被销毁的。而在Java中,并非所有对象都会被GC进行“回收”的。换句话说:

1、对象可能不被回收。

2、垃圾回收不等于析构。

 

这意味着在不需要某个对象之前,如果必须执行某些动作,那么就得需要自己手动来做。Java并未提供“析构函数”类似的概念,要做类似的清除工作,程序员必须手动创建一个执行清除工作的普通方法。

 

finalize()的用途 

 

看完上面这一段话,相信读者都明白了——不能使用finalize()作为通用的垃圾回收方法。那么finalize()真正的用途是什么呢?

这里引出要记住的第三点:

3、垃圾回收只与内存有关。

 

其实理解简单,Java允许调用C/C++函数、方法,而C/C++可以调用其他语言代码。所以,如果在C/C++编写代码中,使用了malloc进行内存分配,此时GC不能释放这些内存了。所以这个时候,finalize()登场了。 

 

你必须执行清除

Java不允许创建局部对象,程序员必须使用new,在Java中,找不到”delete释放对象,因为GC帮助释放存储空间。但是,GC存在不能替代类似C++析构函数。如果希望进行释放存储空间以外清除工作,还是明确调用某个恰当的Java方法。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics