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的行爲)
歡迎關注本站公眾號,獲取更多信息