-
介紹
假如你的對象(並非通過new)獲得了一塊內存區域,由於垃圾回收器只知道回收那些通過new分配的內存,所以它不知道該如何釋放這塊內存,爲了應對這種特殊情況Java允許在類中定義一個名爲finalize()的方法
-
工作原理
一旦垃圾回收器準備好釋放對象佔用的存儲空間,將會首先調用其finalize()方法,並且在下一次垃圾回收動作發生時,纔會真正回收對象佔用的內存,所以要是打算用finalize函數,就能在垃圾回收時刻做一些重要的清理動作。
-
注意說明
有三點需要注意
1:對象可能不被垃圾回收。
2:垃圾回收並不等同於“析構”(C++中銷燬對象必須用到這個函數)
3:垃圾回收只與內存有關
-
用途
使用垃圾回收器的唯一原因是爲了回收程序不再使用的內存,所以對於與垃圾回收有關的任何行爲來說(尤其是finalize函數),它們也必須同內存及其回收有關。
但這並不意味着對象中含有其他對象,finalize函數就應該明確釋放那些對象,因爲垃圾回收器會負責釋放對象佔據的所有內存。這就對finalize函數的需求限制爲一種特殊情況,即通過某種創建對象方式以外的方式爲對象分配了存儲空間,所以之所以要有finalize函數是由於在分配內存的時候可能採用了類似C語言的方法而非Java中的通常做法。這種情況主要發生在使用“本地方法”的情況下,本地方法是一種在Java中調用非Java代碼的方式,在非Java代碼中也許會調用C的malloc()函數系列來分配空間,而且除非調用free()函數,否則存儲空間會一直得不到釋放,導致內存泄漏。free是C和C++的函數,所以需要在finalize()中使用本地方法調用它來釋放內存。