Java-finalize函數介紹(學習筆記)

  • 介紹

       假如你的對象(並非通過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()中使用本地方法調用它來釋放內存。

 

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