finalize()

来源:互联网 发布:java发牌器 编辑:程序博客网 时间:2024/05/02 01:52

java中垃圾回收器准备释放内存时,将首先调用finalize(),并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。
1、对象可能不会被回收
2、垃圾回收不等于c++的析构函数
3、垃圾回收只与内存有关
4、JVM还没到耗尽内存的地步,是不会进行垃圾回收的(不可将finalize作为通用的清理方法)

//注:通常情况下,内存管理意义下的堆(heap)和栈(stack)的访问速度是相同的。

存储空间的释放速度会影响存储空间的分配速度,二者紧密联系,但是访问速度和分配/释放速度不一定有啥关系。

之前的程序语言中,在heap上分配对象的代价是十分昂贵的,但java的垃圾回收机制对于提升对象的创建速度有明显的提高。

java从heap分配空间的速度,可以和其他语言从stack上分配空间的速度相媲美。//

java中撤销一个对象时,需要保证资源被释放,提供了收尾(finalization)机制,定义一些特殊的操作,这些操作在一个对象将被垃圾回收程序释放是执行。

垃圾回收周期性运行,检查是否被运行状态/其他对象引用(引用计数)。

finalize()通用格式
protected void finalize()
{
//finalization code here
}
“`

理解finalize( ) 正好在垃圾回收以前被调用非常重要。例如当一个对象超出了它的作用域时,finalize( ) 并不被调用。这意味着你不可能知道何时——甚至是否——finalize( ) 被调用。因此,你的程序应该提供其他的方法来释放由对象使用的系统资源,而不能依靠finalize( ) 来完成程序的正常操作。
注意:如果你熟悉C ,那你知道C 允许你为一个类定义一个撤消函数(destructor ),它在对象正好出作用域之前被调用。Java不支持这个想法也不提供撤消函数。finalize() 方法只和撤消函数的功能接近。当你对Java 有丰富经验时,你将看到因为Java使用垃圾回收子系统,几乎没有必要使用撤消函数。

最终的界限
与 Java 不同,C++ 支持局部对象(基于栈)和全局对象(基于堆)。因为这一双重支持,C++ 也提供了自动构造和析构,这导致了对构造函数和析构函数的调用,(对于堆对象)就是内存的分配和释放。
Java 中,所有对象都驻留在堆内存,因此局部对象就不存在。结果,Java 的设计者觉得不需要析构函数(象 C++ 中所实现的)。
取而代之,Java 定义了一个特殊的方法叫做finalize() ,它提供了 C++ 析构函数的一些功能。但是,finalize() 并不完全与 C++ 的析构函数一样,并可以假设它会导致一系列的问题。finalize() 方法作用的一个关键元素是 Java 的垃圾回收器

0 0
原创粉丝点击