finalize()是在java.lang.Object裏定義的,也就是說每個對象都有這麼個方法。這個方法在gc啓動,該對象被回收的時候被調用。其實gc能夠回收大部分的對象(凡是new出來的對象,gc都能搞定,通常狀況下咱們又不會用new之外的方式去建立對象),因此通常是不須要程序員去實現finalize的。
特殊狀況下,須要程序員實現finalize,當對象被回收的時候釋放一些資源,好比:一個socket連接,在對象初始化時建立,整個生命週期內有效,那麼就須要實現finalize,關閉這個連接。
使用finalize還須要注意一個事,調用super.finalize();java
一個對象的finalize()方法只會被調用一次,並且finalize()被調用不意味着gc會當即回收該對象,因此有可能調用finalize()後,該對象又不須要被回收了,而後到了真正要被回收的時候,由於前面調用過一次,因此不會調用finalize(),產生問題。
因此,推薦不要使用finalize()方法,它跟析構函數不同。程序員
1.object定義 protected void finalize()
//定義爲子類可見segmentfault
2.執行時機不可預知
當一個對象變得不可觸及時,垃圾回收器某個時期會回收此對象。
當回收對象以前會調用finalize方法,這相似於人類臨終以前必須作一件事情:寫遺言。
由於GC是不肯定性的(這跟JVM相關),因此finalize方法的執行具備不可預知性。安全
3.finalize忽略異常
即finalize代碼中若出現異常,異常會被忽略socket
4.finalize使用
何時使用?通常來講,finalize被做爲第二種安全網來使用,如FileInputStream類,
當對象回收時,有可能資源爲釋放,因此這裏第二次來確認(那也總比不釋放強吧,雖然具體釋放時機未定)函數
protected void finalize() throws IOException { if (fd != null) { if (fd != fd.in) { close(); } } }
注意:某些用到finalize的地方,你必須像以下所示,顯式調用回收鏈。spa
protected void finalize() throws IOException {
try{ ... }finally{ super.finalize(); } }
5.<\effective java>建議:儘可能不要使用finalize,除非以它做爲安全網,或是爲了終結非關鍵的原生資源。code
總結起來finalize()方法能夠這樣記憶:對象
Object類定義;執行不可預知,忽略異常,通常作第二安全網blog
參考地址:http://caizi0413.iteye.com/blog/845727
https://segmentfault.com/q/1010000000094660