finalize

finalize的做用性能

  • finalize()是Object的protected方法,
    • 子類能夠覆蓋該方法以實現資源清理工做,
    • GC在回收對象以前調用該方法。

大體描述一下finalize流程:spa

  • 當對象變成(GC Roots)不可達時,GC會判斷該對象是否覆蓋了finalize方法,
    • 若未覆蓋,則直接將其回收。
    • 不然,若對象未執行過finalize方法,將其放入F-Queue隊列,
    • 由一低優先級線程執行該隊列中對象的finalize方法。
  • 執行finalize方法完畢後,
    • GC會再次判斷該對象是否可達,
    • 若不可達,則進行回收,
    • 不然,對象「復活」。

finalize的問題

  • 一些與finalize相關的方法,
    • 因爲一些致命的缺陷,已經被廢棄了,
    • 如System.runFinalizersOnExit()方法、Runtime.runFinalizersOnExit()方法
  • System.gc()與System.runFinalization()方法
    • 增長了finalize方法執行的機會,但不可盲目依賴它們
  • Java語言規範並不保證finalize方法會被及時地執行、
    • 並且根本不會保證它們會被執行
  • finalize方法可能會帶來性能問題。
    • 由於JVM一般在單獨的低優先級線程中完成finalize的執行
  • 對象再生問題:finalize方法中,
    • 可將待回收對象賦值給GC Roots可達的對象引用,從而達到對象再生的目的
  • finalize方法至多由GC執行一次(用戶固然能夠手動調用對象的finalize方法,但並不影響GC對finalize的行爲)
相關文章
相關標籤/搜索