2011-12-13 20 views
2

我們都知道JRE會銷燬任何不能再被引用的對象。但是有沒有辦法讓對象明確地摧毀自己?或者是禁止避免懸掛指針問題?天真地,我想說的是this = null,但那是編譯器不允許的(this可能不是真正的變量)。對象是否會自毀? (Java)

相反,是否有辦法通過維護this的私人副本或其他方式強制保持自己的活力?

+0

昨天當我意識到Unix中的文件硬鏈接的目的以及與垃圾收集系統的類比時,我已經開悟了。 – jforberg 2011-12-13 18:52:57

回答

2

忽略學術方面,你不能確保一個對象在Java(或大多數其他垃圾收集語言,如C#)中被物理破壞。這是因爲破壞對象是昂貴的(部分原因是內存壓縮階段),所以重點是儘可能少地運行它。然而

這就是說,你可以強制對象使用一次性模式,其中有問題的對象公開的公共方法來釋放資源,以釋放其分配的資源,並且可以隨時調用它(或它獲得在終結器中自動調用)。它需要更多的簿記,但如果真的需要它可以完成工作。

4

其實你不能強行破壞什麼東西。即使你沒有對象的引用,它仍然會一直存在於內存中,直到垃圾收集器決定運行並收集它爲止。

您可以通過保持對象的靜態引用來使對象保持活動狀態。

1

不,你不能摧毀一個物體。

你可以做的是有一個包裝對象,它包含了實際的對象。如果確保沒有其他人引用該對象,則刪除引用(例如,將其設置爲空)將使該對象符合垃圾回收器的條件。請注意,GC決定何時以及是否真正收集垃圾仍然由GC決定。

爲了保持一個對象的活着,你需要確保有一個對象的引用。一種方法是從對象的類中獲取靜態引用。只要沒有人卸載該類,對象就會留在內存中。

0

正如你所說,我認爲它是禁止避免搖晃的指針問題。 Java內存模型是基於Stack和Heap模型的,如果一個對象破壞自身,那麼會引用該對象的棧(或)其他指針是什麼?