finalize

垃圾回收器負責回收全部無任何引用對象的內存空間。 java

注意:垃圾回收回收的是無任何引用的對象佔據的內存空間而不是對象自己。 jvm

1. System.gc();   Runtime.getRuntime().gc() 這兩種方法用於顯示通知JVM能夠進行一次垃圾回收,但垃圾回收機制具體在什麼時間運行是沒法預知的。 函數

2.finalize() 方法 釋放對象所佔用的相關資源。 spa

當垃圾回收器將要釋放無用對象的內存時,先調用該對象的finalize()方法。若是在程序終止以前垃圾回收器始終沒有執行垃圾回收操做,那麼垃圾回收器將始終不會調用無用對象的finalize()方法。由於finalize()只有在垃圾回收器工做的時候纔會被調用,也就是說,經過它進行資源釋放並不能確保立刻被釋放,甚至可能根本不會被釋放(由於垃圾回收器可能不會工做)。程序即便顯式調用System.gc()或Runtime.gc()方法,也不能保證垃圾回收操做必定執行,所以不能保證無用對象的finalize()方法必定被調用。 對象

 

關於finalize()方法: 內存

java提供finalize()方法,垃圾回收器準備釋放內存的時候,會先調用finalize()。 資源

      (1).對象不必定會被回收。
      (2).垃圾回收不是析構函數。
      (3).垃圾回收只與內存有關。
      (4).垃圾回收和finalize()都是靠不住的,只要JVM尚未快到耗盡內存的地步,它是不會浪費時間進行垃圾回收的。 作用域

     垃圾收集器在進行垃圾收集的時候會自動呼叫對象的finalize方法,用來進行一些用戶自定義的非內存清理工做,由於垃圾收集器不會處理內存之外的東西。因此,有的時候用戶須要定義一些清理的方法,好比說處理文件和端口之類的非內存資源。 get

      finalize的工做原理應該是這樣的:一旦垃圾收集器準備好釋放對象佔用的存儲空間,它首先調用finalize(),並且只有在下一次垃圾收集過程當中,纔會真正回收對象的內存.因此若是使用finalize(),就能夠在垃圾收集期間進行一些重要的清除或清掃工做. io

      finalize()在何時被調用?

      有三種狀況
      1.全部對象被Garbage Collection時自動調用,好比運行System.gc()的時候.
      2.程序退出時爲每一個對象調用一次finalize方法。
      3.顯式的調用finalize方法

      除此之外,正常狀況下,當某個對象被系統收集爲無用信息的時候,finalize()將被自動調用,可是jvm不保證finalize()必定被調用,也就是說,finalize()的調用是不肯定的,這也就是爲何sun不提倡使用finalize()的緣由。

     理解finalize( ) 正好在垃圾回收之前被調用很是重要。例如當一個對象超出了它的做用域時,finalize( ) 並不被調用。這意味着你不可能知道什麼時候——甚至是否——finalize( ) 被調用。所以,你的程序應該提供其餘的方法來釋放由對象使用的系統資源,而不能依靠finalize( ) 來完成程序的正常操做。

相關文章
相關標籤/搜索