關於JAVA垃圾收集器與類的finalize()方法的一些總結

摘自網站www.matrix.org.cn

1.垃圾收集器的工作目標是回收已經無用的對象的內存空間,從而避免內存滲漏體的產生,節省內存資源,避免程序代碼的崩潰。

2.垃圾收集器判斷一個對象的內存空間是否無用的標準是:如果該對象不能再被程序中任何一個"活動的部分"所引用,此時我們就說,該對象的內存空間已經無用。所謂"活動的部分",是指程序中某部分參與程序的調用,正在執行過程中,尚未執行完畢。

3.垃圾收集器線程雖然是作爲低優先級的線程運行,但在系統可用內存量過低的時候,它可能會突發地執行來挽救內存資源。當然其執行與否也是不可預知的。

4.垃圾收集器不可以被強制執行,但程序員可以通過調用System. gc方法來建議執行垃圾收集器。

5.不能保證一個無用的對象一定會被垃圾收集器收集,也不能保證垃圾收集器在一段Java語言代碼中一定會執行。因此在程序執行過程中被分配出去的內存空間可能會一直保留到該程序執行完畢,除非該空間被重新分配或被其他方法回收。由此可見,完全徹底地根絕內存滲漏體的產生也是不可能的。但是請不要忘記,Java的垃圾收集器畢竟使程序員從手工回收內存空間的繁重工作中解脫了出來。設想一個程序員要用C或C++來編寫一段10萬行語句的代碼,那麼他一定會充分體會到Java的垃圾收集器的優點!

6.同樣沒有辦法預知在一組均符合垃圾收集器收集標準的對象中,哪一個會被首先收集。

7.循環引用對象不會影響其被垃圾收集器收集。

8.可以通過將對象的引用變量(reference variables,即句柄handles)初始化爲null值,來暗示垃圾收集器來收集該對象。但此時,如果該對象連接有事件監聽器(典型的 AWT組件),那它還是不可以被收集。所以在設一個引用變量爲null值之前,應注意該引用變量指向的對象是否被監聽,若有,要首先除去監聽器,然後纔可以賦空值。

9.每一個對象都有一個finalize( )方法,這個方法是從Object類繼承來的。

10.finalize( )方法用來回收內存以外的系統資源,就像是文件處理器和網絡連接器。該方法的調用順序和用來調用該方法的對象的創建順序是無關的。換句話說,書寫程序時該方法的順序和方法的實際調用順序是不相干的。請注意這只是finalize( )方法的特點。

11.每個對象只能調用finalize( )方法一次。如果在finalize( )方法執行時產生異常(exception),則該對象仍可以被垃圾收集器收集。

12.垃圾收集器跟蹤每一個對象,收集那些不可到達的對象(即該對象沒有被程序的任何"活的部分"所調用),回收其佔有的內存空間。但在進行垃圾收集的時候,垃圾收集器會調用finalize( )方法,通過讓其他對象知道它的存在,而使不可到達的對象再次"復甦"爲可到達的對象。既然每個對象只能調用一次finalize( )方法,所以每個對象也只可能"復甦"一次。

13.finalize( )方法可以明確地被調用,但它卻不能進行垃圾收集。

14.finalize( )方法可以被重載(overload),但只有具備初始的finalize( )方法特點的方法纔可以被垃圾收集器調用。

15.子類的finalize( )方法可以明確地調用父類的finalize( )方法,作爲該子類對象的最後一次適當的操作。但Java編譯器卻不認爲這是一次覆蓋操作(overriding),所以也不會對其調用進行檢查。

16.當finalize( )方法尚未被調用時,System. runFinalization( )方法可以用來調用finalize( )方法,並實現相同的效果,對無用對象進行垃圾收集。

17.當一個方法執行完畢,其中的局部變量就會超出使用範圍,此時可以被當作垃圾收集,但以後每當該方法再次被調用時,其中的局部變量便會被重新創建。

18.Java語言使用了一種"標記交換區的垃圾收集算法"。該算法會遍歷程序中每一個對象的句柄,爲被引用的對象做標記,然後回收尚未做標記的對象。所謂遍歷可以簡單地理解爲"檢查每一個"。

19.Java語言允許程序員爲任何方法添加finalize( )方法,該方法會在垃圾收集器交換回收對象之前被調用。但不要過分依賴該方法對系統資源進行回收和再利用,因爲該方法調用後的執行結果是不可預知的。 通過以上對垃圾收集器特點的瞭解,你應該可以明確垃圾收集器的作用,和垃圾收集器判斷一塊內存空間是否無用的標準。簡單地說,當你爲一個對象賦值爲null並且重新定向了該對象的引用者,此時該對象就符合垃圾收集器的收集標準。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章