当垃圾收集器认为没有指向对象实例的引用时,会在销毁该对象之前调用finalize()方法。该方法最常见的作用是确保释放实例占用的全部资源。java并不保证定时为对象实例调用该方法,甚至不保证方法会被调用,所以该方法不应该用于正常内存处理。
下文链接:http://www.softhouse.com.cn/news/show/194.html
在许多方面,
Java
类似于
C++
。
Java
的语法非常类似于
C++
,
Java
有类、方法和数据成员;
Java
的类有构造函数;
Java
有异常处理。
但是,如果你使用过
C++
会发现
Java
也丢掉一些可能是你熟悉的特性。这些特性之一就是析构函数。取代使用析构函数,
Java
支持
finalize()
方法。
在本文中,我们将描述
finalize()
与
C++
析构函数的区别。另外,我们将创建一个简单的
Applet
来演示
finalize()
是如何工作的。
最终的界限
与
Java
不同,
C++
支持局部对象(基于栈)和全局对象(基于堆)。因为这一双重支持,
C++
也提供了自动构造和析构,这导致了对构造函数和析构函数的调用,(对于堆对象)就是内存的分配和释放。
在
Java
中,所有对象都驻留在堆内存,因此局部对象就不存在。结果,
Java
的设计者觉得不需要析构函数(象
C++
中所实现的)。
取而代之,
Java
定义了一个特殊的方法叫做
finalize()
,它提供了
C++
析构函数的一些功能。但是,
finalize()
并不完全与
C++
的析构函数一样,并可以假设它会导致一系列的问题。
finalize()
方法作用的一个关键元素是
Java
的垃圾回收器。
垃圾回收器
在
C/C++
、
Pascal
和其他几种多种用途的编程语言中,开发者有责任在内存管理上发挥积极的作用。例如,如果你为一个对象或数据结构分配了内存,那么当你不再使用它时必须释放掉该内存。
在
Java
中,当你创建一个对象时,
Java
虚拟机(
JVM
)为该对象分配内存、调用构造函数并开始跟踪你使用的对象。当你停止使用一个对象(就是说,当没有对该对象有效的引用时),
JVM
通过垃圾回收器将该对象标记为释放状态。
当垃圾回收器将要释放一个对象的内存时,它调用该对象的
finalize()
方法(如果该对象定义了此方法)。垃圾回收器以独立的低优先级的方式运行,只有当其他线程挂起等待该内存释放的情况出现时,它才开始运行释放对象的内存。(事实上,你可以调用
System.gc()
方法强制垃圾回收器来释放这些对象的内存。)
在以上的描述中,有一些重要的事情需要注意。首先,只有当垃圾回收器释放该对象的内存时,才会执行
finalize()
。如果在
Applet
或应用程序退出之前垃圾回收器没有释放内存,垃圾回收器将不会调用
finalize()
。
其次,除非垃圾回收器认为你的
Applet
或应用程序需要额外的内存,否则它不会试图释放不再使用的对象的内存。换句话说,这是完全可能的:一个
Applet
给少量的对象分配内存,没有造成严重的内存需求,于是垃圾回收器没有释放这些对象的内存就退出了。
显然,如果你为某个对象定义了
finalize()
方法,
JVM
可能不会调用它,因为垃圾回收器不曾释放过那些对象的内存。调用
System.gc()
也不会起作用,因为它仅仅是给
JVM
一个建议而不是命令。
finalize()
有什么优点呢?
如果
finalize()
不是析构函数,
JVM
不一定会调用它,你可能会疑惑它是否在任何情况下都有好处。事实上,在
Java 1.0
中它并没有太多的优点。
根据
Java
文档,
finalize()
是一个用于释放非
Java
资源的方法。但是,
JVM
有很大的可能不调用对象的
finalize()
方法,因此很难证明使用该方法释放资源是有效的。
Java 1.1
通过提供一个
System.runFinalizersOnExit()
方法部分地解决了这个问题。(不要将这个方法与
Java 1.0
中的
System.runFinalizations()
方法相混淆。)不象
System.gc()
方法那样,
System.runFinalizersOnExit()
方法并不立即试图启动垃圾回收器。而是当应用程序或
Applet
退出时,它调用每个对象的
finalize()
方法。
正如你可能猜测的那样,通过调用
System.runFinalizersOnExit()
方法强制垃圾回收器清除所有独立对象的内存,当清除代码执行时可能会引起明显的延迟。现在建立一个示例
Applet
来演示
Java
垃圾回收器和
finalize()
方法是如何相互作用的。
分享到:
相关推荐
Java 中 finalize 方法使用 finalize 方法是 Java 编程语言中一个非常重要的方法,它与 Java 编程中的垃圾回收器有着紧密的关系。当一个对象变成一个垃圾对象的时候,如果此对象的内存被回收,那么就可以调用系统中...
Java中的`finalize()`方法是Java语言提供的一种机制,用于在对象被垃圾回收之前进行资源清理。这个方法在Java的`Object`类中被定义为`protected`类型,因此所有Java类都能够覆盖它来实现特定的清理操作。在垃圾回收...
Java 中的 finalize() 方法是垃圾回收器在回收对象时调用的第一个方法。finalize() 方法相当于析构函数,它是垃圾回收器回收一个对象时第一个要调用的方法。finalize() 方法的主要作用是释放对象占用的系统资源,...
这个引用对象专门为带finalize方法的类服务,可以理解为每一个有相应的方法的对象,其都会封装为一种finalRefernece对象. 因为finalize方法是object定义的,其默认实现为空.那么如果重写了此方法,那么方法体...
在Java中,finalize()方法是一个重要的概念,它与final关键字息息相关。下面我们将深入探讨finalize()方法的用法和应用场景。 一、final关键字 final是Java的关键字,它所表示的是“这部分是无法修改的”。在程序...
在Java编程语言中,`finalize()`方法是一个特殊的方法,它属于`Object`类,主要用于对象销毁前执行一些必要的清理工作。然而,随着Java版本的更新和垃圾收集机制的改进,`finalize()`方法逐渐失去了其原本的重要性,...
Java中的finalize方法是一个特殊的方法,位于Java.lang.Object类中,它的主要作用是允许开发者在对象被垃圾回收前执行一些清理工作。但是,finalize方法存在许多问题,导致它不被推荐使用。 首先,finalize方法的...
Java中的finalize()方法覆盖实例代码详解 finalize()方法是Java中的一个特殊方法,它可以在对象被垃圾回收器回收之前执行一次。这个方法可以用来释放对象持有的资源,但是它的使用需要非常小心,因为它带有很多不...
Java中的`finalize`方法是Object类的一个特殊方法,它的主要作用是在对象被垃圾收集器回收前执行清理工作。本文将详细解析`finalize`方法的实现和执行过程。 首先,了解`finalize`方法的用途:当一个对象不再被任何...
Java垃圾回收机制的finalize方法是垃圾回收机制中一个非常重要的概念,它可以帮助开发者更好地理解和掌握垃圾回收机制的工作机理。本文将通过实例形式分析finalize方法的特点及在垃圾回收机制中的相关操作技巧。 一...
在Java编程语言中,`final`, `finally`, 和 `finalize` 是三个非常重要的关键字,它们各自扮演着不同的角色,尤其在处理程序的可预测性、数据的不可变性和垃圾回收等方面。下面将详细阐述这三个关键字的区别及其应用...
Java中final,finally,finalize三个关键字的区别_动力节点Java学院整理
java中final, finally, finalize 的区别
Java编程中的`final`, `finalize`, 和`finally`是三个重要的关键字,它们各自在不同的场景下发挥着关键作用。理解这三个关键字的区别对于Java开发者来说至关重要,尤其是在面试中常常会被问及。 首先,`final`是一...
Java中的`finalize()`方法是对象生命周期的一部分,它与C++中的析构函数类似,但在功能和调用时机上有所不同。`finalize()`方法是在对象被GC标记为可回收并准备释放之前调用的,提供了在对象被彻底删除前执行某些...
Object类中包含了一些基础且重要的方法,这些方法在Java编程中扮演着关键角色。接下来我们将详细讨论这些方法以及`finalize()`函数的作用。 1. `clone()`方法:这是一个保护方法,用于实现对象的浅复制。如果一个类...
3. finalize中的错误可能导致内存泄漏。 4. 如果不在需要时,也没有办法取消垃圾回收。 5. 并且没有办法保证finlize的执行时间。 在JDK9中,finalize()方法已经被废除,取而代之的是Cleaner类。Cleaner类提供了一个...
现代Java版本中,更倾向于使用显式资源管理或尝试-资源语句来替代`finalize`方法的使用。 ### HashMap与Hashtable #### HashMap `HashMap`是Java集合框架中的一部分,提供基于哈希表的键值对存储。它允许单个空键...
`finalize()`方法是在`Object`类中定义的,这意味着所有Java类都默认继承了这个方法。然而,通常情况下,`finalize()`方法是不需要程序员去实现的,因为垃圾收集器的自动清理已经足够处理大部分情况。只有在特殊情况...