終結處理和垃圾回收(1)

   之前一直不瞭解Java的垃圾回收原理,最近看了Java編程思想,有點想法,做做筆記。

    首先,我們都瞭解初始化的重要性,但是常常會忘記同樣也重要的清理工作。Java有垃圾回收器負責回收無用對象佔用的內存資源。但是也有特殊情況:假定你的對象(並非使用new)獲得一塊“特殊”的內存區域,由於垃圾回收器只知道釋放那些經由new分配的內存,所以它不知道如何釋放該對象的這塊特殊內存。爲了應對這種情況,Java允許在類中定義一個名爲finalize()方法。

    Java的finalize()不同於C++裏的析構函數:

    1.對象可能不被垃圾回收,

    2.垃圾回收並不等於析構。

   所以在Java中你不需要某個對象之前,如果必須執行某些動作,那麼必須手動創建一個方法去做這些操作。

    那麼finalize9)真正用處是什麼?這裏引出第三點:

    3.垃圾回收只與內存有關。

    也就是說,使用垃圾回收器唯一的原因是爲了回收程序不再使用的內存。之所以要有finalize(),是由於再分配內存時可能採用了類似C語言的做法,而非Java中的通常做法。這種情況主要發生在使用“本地方法”的情況下,本地方法是一種在Java中調用非Java代碼的方式。本地方法目前只支持C和C++,但是它們可以調用其他語言寫的代碼,所以實際上可以調用任何代碼。在非Java代碼中你也許會調用C的malloc()函數系列來分配存儲空間,而且除非調用了free()函數,否則存儲空間將得不到釋放,從而造成內存泄漏。而這些需要在finalize()中用本地方法調用它。

    所以通常我們的“清理”工作並不能指望finalize()方法。

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