2012-08-15 25 views
1

我有一個對Spring的ApplicationContext有靜態引用的類。當班級即將卸載時,我需要清除該上下文並運行其單例bean的銷燬方法。那麼,是否有一些類級別的終結器回調函數在類被卸載時調用,所以我可以清除回調中的上下文?Java:一個類的finalizer?

我有使用WeakReferenceQueue和計數器來跟蹤類的非引用的對象,所以當類沒有存活的對象,我可以檢測一個模糊的概念,但仍然不會告訴我,當類本身被卸載。

+5

這是你應該讓容器擔心和處理的工作。必須處理自己生命週期的對象是代碼異味,並且很難正確實現100%。 – 2012-08-15 04:22:17

+0

所有的類都有效地引用了它們的類加載器,而這又加強了對所有類的引用。因此,單個類加載器的所有類都可以共同收集。 – 2012-08-15 04:43:38

回答

1

那麼,是否有一些類級別的終結器回調,當類被卸載時調用。

我看着明顯的地方,據我所知,沒有這樣的回調。除了破解JVM本身之外,我無法想出實現它的方法。

1

「卸載類」的方法是讓所有類都不可訪問,並且ClassLoader也加載它們。有關此過程的完整說明,請參見Unloading classes in java?

一個類是一個像Java中的任何其他對象。所以經典的調用finalizer()也是爲類實現的。此方法由垃圾收集器調用,而不是您明確地調用。

在Java中沒有其他標準的方式來卸載類或對象。如果沒有其他對象引用包含dispose()的對象(稱爲「RefCount」),則可以通過實現一個方法(例如,稱爲「dispose()」)自行完成。

要知道對象的當前refcount或真的強制垃圾收集,你必須使用JVM Tool Interface

您也可以嘗試致電System.runFinalization(),但JVM並未保證所有終結器都會被調用。

+0

我知道如何卸載類。我的問題是關於Java是否提供了一些類級別的回調方法,這是在某個類即將卸載時調用的。如果沒有,是否可以模擬,如果是的話,如何? – shrini1000 2012-08-15 05:59:09