与C++不同,Java有自己的垃圾回收机制,同时,Java没有了析构函数的概念,转而提供了一个finalize方法,那么finalize方法会在什么时间执行呢?
或许有人以为是在将引用设置为null的时候,现在先看下面的例子:
1.
- public class Test {
- 2. public static void main(String[] args) {
- 3.
- 4. Demo d = new Demo();
- 5. System.out.println("begin to set d to null");
- 6. d = null;
- 7. System.out.println("d was set to null");
- 8. }
- 9. }
- 10.
- 11. class Demo {
- 12. @Override
- 13. protected void finalize() throws Throwable {
- 14.
- 15. System.out.println("Demo finalized");
- 16. super.finalize();
- 17. }
- 18. }
运行一下代码,结果如下:
- 1. begin to set d to null
- 2. d was set to null
finalize方法根本没有被执行,看一下java中对finalize方法的定义:Called by the garbage collector on an object when garbage collection determines that there are no more references to the object. 当垃圾回收确认没有指向对象的引用时,执行回收。而上面的代码新建的对象Demo的唯一引用d已经被释放,而确有执行Demo类的finalize方法,唯一的原因只能是gc并没有执行,gc只有在JVM内存不足的时候才会自动执行,为了测试,我们将代码作一下修改:
- 1. public class Test {
- 2. public static void main(String[] args) {
- 3.
- 4. Demo d = new Demo();
- 5. System.out.println("begin to set d to null");
- 6. d = null;
- 7. System.out.println("d was set to null");
- 8. System.out.println("begin run gc");
- 9. System.gc();
- 10. System.out.println("gc runed");
- 11. }
- 12. }
- 13.
- 14. class Demo {
- 15. @Override
- 16. protected void finalize() throws Throwable {
- 17.
- 18. System.out.println("Demo finalized");
- 19. super.finalize();
- 20. }
- 21. }
运行结果如下:
- 1. begin to set d to null
- 2. d was set to null
- 3. begin run gc
- 4. gc runed
- 5. Demo finalized
所以finalize方法只有在JVM执行gc时才会被执行,所以我们在写代码用到的时候需注意,这里面的代码不知道什么时候才会去执行,所以要尽量少用。
分享到:
相关推荐
在 Java 中,finalize() 方法是 Object 类的一个方法,默认情况下,纯 Java 编写的 Class 不需要重新覆盖这个方法。只有在特殊情况下,例如使用 JNI 或 C++ 编写的 Class 时,需要覆盖默认的 finalize() 方法,以...
另外,finalize 方法的执行时间也是不确定的,因为垃圾回收器的回收时间是不可预测的。因此,在实际开发中,应该尽量避免使用 finalize 方法,而应该使用其他方法来释放资源。 finalize 方法是一个非常重要的方法,...
在Java编程语言中,`finalize()`方法是一个特殊的方法,它属于`Object`类,主要用于对象销毁前执行一些必要的清理工作。然而,随着Java版本的更新和垃圾收集机制的改进,`finalize()`方法逐渐失去了其原本的重要性,...
Java中的`finalize()`方法是Java语言提供的一种机制,用于在对象被垃圾回收之前进行资源清理。这个方法在Java的`Object`类中被定义为`protected`类型,因此所有Java类都能够覆盖它来实现特定的清理操作。在垃圾回收...
Java垃圾回收机制的finalize方法实例分析 Java垃圾回收机制的finalize方法是垃圾回收机制中一个非常重要的概念,它可以帮助开发者更好地理解和掌握垃圾回收机制的工作机理。本文将通过实例形式分析finalize方法的...
Java 中的 final、finally 和 finalize 关键字有什么区别? final:当用“final”关键字声明一个变量时,它的值一旦被赋值就不能改变。当使用“final”关键字声明方法时,它不能在子类中被覆盖。当用“final”...
垃圾回收器在什么时候调用finalize方法是不知道的,它可能是在对象被垃圾回收时,也可能是在JVM退出时。这种不确定性会导致资源浪费和泄露的风险。 其次,finalize方法可能不被调用。在某些情况下,finalize方法...
* 执行清理操作:finalize()方法可以用来执行清理操作,例如删除临时文件等。 例如,在下面的代码中,我们定义了一个finalize()方法: ```java public class FinalTest { @Override protected void finalize() ...
finalize()方法是Java中的一个特殊方法,它可以在对象被垃圾回收器回收之前执行一次。这个方法可以用来释放对象持有的资源,但是它的使用需要非常小心,因为它带有很多不确定性。 在Java中,finalize()方法是Object...
在Java编程语言中,`final`, `finally`, 和 `finalize` 是三个非常重要的关键字,它们各自扮演着不同的角色,尤其在处理程序的可预测性、数据的不可变性和垃圾回收等方面。下面将详细阐述这三个关键字的区别及其应用...
Java编程中的`final`, `finalize`, 和`finally`是三个重要的关键字,它们各自在不同的场景下发挥着关键作用。理解这三个关键字的区别对于Java开发者来说至关重要,尤其是在面试中常常会被问及。 首先,`final`是一...
这个引用对象专门为带finalize方法的类服务,可以理解为每一个有相应的方法的对象,其都会封装为一种finalRefernece对象. 因为finalize方法是object定义的,其默认实现为空.那么如果重写了此方法,那么方法体...
这个线程池以无界队列的方式运行,确保任务按顺序执行,并且任何时候只有一个线程是活动的。 - 返回值:一个新的`ExecutorService`对象。 - 特点: - 如果在关闭前因执行失败导致单个线程终止,将有一个新线程...
但是,这种方法存在一些问题,例如finalize()方法可能不会被执行,或者执行时间具有不确定性。 在JDK9中,我们可以使用Cleaner类来代替finalize()方法。Cleaner类提供了一个更安全、更可靠的方式来释放对象占用的...
Java中的`finalize`方法是Object类的一个特殊方法,它的主要作用是在对象被垃圾收集器回收前执行清理工作。本文将详细解析`finalize`方法的实现和执行过程。 首先,了解`finalize`方法的用途:当一个对象不再被任何...
Java中的`finalize()`方法是对象生命周期的一部分,它与C++中的析构函数类似,但在功能和调用时机上有所不同。`finalize()`方法是在对象被GC标记为可回收并准备释放之前调用的,提供了在对象被彻底删除前执行某些...
2. **效率低下**:`finalize` 方法的执行可能会延迟 GC 的完成时间,从而降低程序的运行效率。 3. **替代方案**:现代 Java 编程倾向于使用更可靠的资源管理技术,如 try-with-resources 语句或显式资源管理,而非...
Java经典面试题总结附带答案 以下是从给定文件中生成的相关知识点: Java基础 1. JDK 和 JRE 的区别是什么?(JDK 是 Java Development Kit,JRE 是 Java Runtime Environment) 2. `==` 和 `equals` 的区别是...