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。
添加回答
舉報