2009-06-22 60 views

回答

11

destroy()方法首先被調用。 destroy()將在Servlet容器關閉時被servlet容器調用。 finalize()在垃圾收集器聲明對象之前由JVM調用(並且不保證被調用)。

+0

謝謝你的解釋 – 2009-06-23 04:50:25

3

另外,最後確定()可以或可以不被調用。永遠不要依賴這種事情。當對象超出範圍

0

finalize()方法將調用,並適用於垃圾回收。所以,當對象沒有超出範圍時,它必須在它之前調用destroy()方法。

+0

沒有,敲定()* *可以被稱爲當物體走超出範圍。在關閉JVM之前,不保證被調用。 – 2009-06-22 17:20:50

+0

@mmyers - 在對象超出作用域之前,至少不能調用finalize()方法,但必須在對象超出作用域之前調用destroy()方法。因此在finalize方法之前總是調用destroy方法。 – 2009-06-22 17:26:54

+0

確實,*如果* finalize()被調用,它將在destroy()之後被調用。 「finalize()方法將被稱爲...」而不是「finalize()方法可能被稱爲...」似乎是誤導性的......「 – 2009-06-22 19:38:25

-1

如果你想釋放在一定的時間資源,不依賴於像servlet容器或JVM這樣做外部代碼。儘可能明確地進行資源分配和取消分配。討厭的錯誤可能是由於你依賴外部代碼清理後的結果。

+0

這是你的偏執。如果servlet容器在適當的時候沒有調用destroy(),那麼它是垃圾,應該用另一個替換。你不可能經常重複發明輪子,這就是應用程序服務器所在的地方, – skaffman 2009-06-22 19:20:26

+0

問題是destroy()方法可能會在相當長的時間後調用。這就是爲什麼我說「在特定時間」,這意味着從您自己的代碼中明確釋放資源是控制資源何時被釋放的唯一方式。 當然,你應該依靠servlet容器上做的工作,但在某些情況下,這可能要花很長。 – 2009-06-25 10:31:23

0

有以下5個步驟

  1. 構造
  2. 的init()
  3. 服務()>>的doGet()或doPost()
  4. 破壞()
  5. 的finalize()