如何在 Java 中防止类的对象被垃圾回收

2025 年 4 月 21 日 | 阅读 4 分钟

我们知道,当一个对象没有被引用时,它就会被垃圾收集器自动回收。在本教程中,我们将了解如何在 Java 中避免对象的垃圾回收。不过,在此之前,让我们先举一个垃圾回收的例子。

文件名: ABC.java

输出

Inside the method foo.

解释: 引用变量的作用域仅限于方法 foo()。因此,当控制流离开该方法时,引用 r 将失效,使得在方法 foo() 中创建的对象成为无引用对象,因此,该对象就可以被垃圾收集器回收。

有几种方法可以确保对象在 Java 中不被删除。它们如下所述。

通过增加堆内存

在 Java 中,内存分配给对象是在一个称为“堆”的分区中。此外,众所周知,堆内存是有限的。因此,总有必要释放内存,以便它可以分配给新对象。然而,可以增加堆内存,这将在一定程度上帮助使对象不可删除。

借助单例类

对于单例类,只创建一个对象,该对象由一个静态变量引用。此外,我们知道静态变量的内存分配在类区域(一种内存类型)而不是栈中。因此,静态变量的生命周期会持续到程序结束。下面的程序说明了如何做到这一点。

文件名: Singletn.java

输出

Inside the display method.

上面的例子说明了对象的引用由一个持续到程序结束的静态变量持有。因此,我们也可以说,在程序生命周期结束之前,对象都不会失去引用,使其不可删除。

借助 public void finalise()

finalize() 方法是一个回调方法。它不是由用户调用的方法。相反,它由 JVM 调用。finalize() 方法是在对象上执行的最后一个方法。子类可以覆盖 finalize() 方法以处理系统资源或执行其他清理工作。那么,可以做的是存储将要被删除的对象的引用。下面展示了它的一个说明。

文件名: DemonstrateFinalize.java

输出

The reference of the object is saved. The object will not be gobbled by the garbage collector.

在上面的程序中,只创建了一个类的对象,而且是在方法 foo() 中创建的。因此,当方法执行结束时,引用 obj 被销毁,使得对象成为无引用对象。因此,当运行垃圾收集器回收无引用对象时,finalize() 方法会被执行,在该方法中,无引用对象获得了引用 df,因此,垃圾收集器无法回收该对象。