3 回答
TA贡献1887条经验 获得超5个赞
这实际上更像是一个理论上的事情:当对象不再被其他活动对象引用时,它们就有资格进行垃圾回收。
因此:您可以尝试在finalize()
. 从理论上讲,这将阻止该物体被移除。
实际上有一个“模式名称”:对象复活。现在,这是一种模式,还是更多的反模式,值得争论。
(就我个人而言:我永远不会这样做,而且我从来没有遇到过需要使用这种模式的情况)
TA贡献1804条经验 获得超3个赞
Finalize 是由 JVM 而不是由用户调用的方法,该方法在对象被垃圾收集之前执行,您可以重写 Finalize 方法以在对象被处置之前执行清理操作,或者正如书中所述,有可能您可以防止该对象被垃圾收集。
您可以参考下面的代码作为避免对象被垃圾收集的示例。
class Example {
static Example y;
void func() {
Example x = new Example();
}
pubic void finalize() {
y = this; // Putting the reference id
// of the current object
// into the static variable y
System.out.println("The object won't be collected by the garbage collector");
}
public static void main(String a[]) {
func(); // function called
}
}
TA贡献2037条经验 获得超6个赞
嗯,确实如此。
finalize()当 GC 决定应该删除该对象时,将调用该方法,但这并不意味着该对象将在finalize完成后立即被删除。
IT DOESN'T WORK THIS WAY:
_________________________
IF shouldBeRemoved(object)
object.finalize();
remove(object);
执行后finalize,GC将再次检查该对象是否仍应被删除。为了符合删除资格,不应从可从根对象访问的任何对象引用对象。
IT WORKS THIS WAY
_________________
LABEL
IF shouldBeRemoved(object)
object.finalize();
IF shouldBeRemoved(object)
remove(object);
ELSE
GOTO LABEL
让我们想象一下以下情况:
class Foo {
Application a;
Foo(){};
@Override
public void finalize() {
this.a = Application.getInstance();
}
}
其中Application是代表 的根对象的类Application。在这种情况下,由于a仍然可达,Foo之前符合删除资格的类的对象刚刚复活。
重要说明
不能保证 会finalize被调用,因为它需要另一个对象来处理finalize被调用的方法,因此如果堆上没有足够的可用空间,对象可能会在不调用的情况下被销毁finalize。
添加回答
举报