Java finalize方法是一种特殊的方法,它可以在对象被垃圾回收器回收之前执行一些清理工作。它是Object类中的一个protected方法,可以被子类覆盖。finalize()方法只能被JVM调用,不能直接调用。
finalize()方法有两个重要的作用:
1. 在对象被垃圾回收之前释放系统资源(如文件描述符、数据库连接、socket连接)。 2. 在对象失去引用时执行必要的通知功能。
finalize()方法有一些限制:
1. finalize() 方法不能保证会执行,因为它取决于JVM的垃圾回收机制。 2. finalize() 方法不能保证会在什么时间执行,也不能保证会在对象失去引用时立即执行。 3. finalize() 方法只会执行一次,如果对象重新成功复生后将不会再执行 finalize() 方法。 4. 如果 finalize() 方法中出现了异常或者死循环,将影响JVM的性能。 5. 如果 finalize() 方法中耗时操作过多,将影响JVM的性能。 6. 如果 finalize() 方法中使用了synchronized关键字将影响JVM的性能。 7. 如果 finalize() 方法中使用了wait(), notify(), notifyAll(), sleep(), join(), yield(), park(), unpark() 等方法将影响JVM的性能。
Java提供了一种在对象即将被销毁时执行资源释放的方法。
在Java中,我们创建对象,但是我们不能销毁对象。
JVM运行一个称为垃圾收集器的低优先级特殊任务来销毁不再引用的所有对象。
垃圾回收器给我们一个机会,在对象被销毁之前执行清理代码。
Object类有一个finalize()方法,声明如下:
protected void finalize() throws Throwable { }
Object类中的finalize()方法不会做任何事情。
你需要覆盖你的类中的方法。
您的类的finalize()方法将在您的类的对象销毁之前由垃圾回收器调用。
以下代码显示了如何创建一个Finalize类覆盖对象类的finalize()方法。
class Finalize { private int x; public Finalize(int x) { this.x = x; } public void finalize() { System.out.println("Finalizing " + this.x); } } public class Main { public static void main(String[] args) { for (int i = 0; i < 20000; i++) { new Finalize(i); } } }
上面的代码生成以下结果。
Java面向对象设计 -Java泛型约束无限通配符通配符类型由问号表示,如? 。对于通用类型,通配符类型是对象类型用于原始类型。我...
Java面向对象设计 -Java注释默认值我们可以为注释中的元素定义默认值。我们不需要为带有默认值的注释元素提供值。默认值可以使用...
Java面向对象设计 -Java接口字段一个接口可以有三种类型的成员:常量字段抽象,静态和默认方法静态类型作为嵌套接口和类一个接口...