避免使用終結方法(7)

一、終結方法(finalizer):請儘可能避免使用java

  • 一般是不可預測的、很危險的
  • 會致使不穩定、性能降低,移植問題
  • java中通常用try...catch...finally 回收非內存資源
  • 終結方法不能保證 會被即時的執行
  • JVM會拖延執行終結方法,不該該把寶貴資源回收交給他作

二、及時執行終結算法是垃圾回收算法主要功能,可是各個JVM實現的千差萬別算法

  • java虛擬機根本就不保證終結方法會被執行

三、若是未被捕獲的異常,在終結過程當中拋出,異常能夠被忽略,終結過程也會結束sql

  • 正常狀況下,未被捕獲異常會使線程終止,並打印出棧軌跡,終結方法中則不會

四、使用終結方法會出現嚴重性能問題安全

五、資源確實須要終止,顯式調用終止方法性能

  • 典型事例:InputStream、sql.connection 的 close() 方法
  • 必須在私有域內記錄下狀態,終止後再有人調用,拋 IllegalStateException

六、顯式終止一般與 try ... finally 聯合使用,確保及時終止線程

  • 即使是執行過程有異常拋出,也能保證finally 會被執行

七、終結方法 好處、合法用途1:日誌

  • 對象全部者,忘記顯式終止,能夠作一個安全網
  • 若是終結方法發現 資源還未被釋放,可在日誌中記錄一條警告(bug存在警告)
  • 固然須要視具體狀況 權衡這部分額外代碼的代價是否值得
  • FileInputStream、sql.connection 都包含上述終結方法 安全網

八、合理用途2:對象

  • 對象的本地對等體(native peer)
  • 是一個本地對象,垃圾回收器不可能知道他
  • 在不具備關鍵資源的前提下,可使用終結方法處理
  • 具備關鍵資源的時候,必須顯示的釋放資源(能夠是調取本地方法釋放)

九、終結方法鏈不會自動執行內存

  • 若是子類覆蓋了終結方法,必須手工調用父類終結方法
  • try 塊中調用終結方法,finally 中調用父類終結方法

十、終結方法守衛者資源

  • 把終結方法放在一個匿名內部類中
  • 外圍私有域保持着他的惟一引用
  • 因此兩者會同時啓動結束過程
  • 注意:外圍類Foo並無終結方法

相關文章
相關標籤/搜索