java finalize 何时被调用_finalize()方法什么时候被调用?析构函数(final
finalize()方法也叫收尾方法。
一旦垃圾回收器準備好釋放對象占用的存儲空間,首先會去調用finalize()方法①進行一些必要的清理工作(對垃圾回收器不能處理的特殊情況進行處理)(例子在下邊)②也有可能使該對象重新被引用,我習慣叫這種作用為復活。注意!!每個對象的finalize()方法只能被執行一次,第二次就會直接跳過finalize()方法,這就是為了防止出現對象無限復活,內存空間只增不減。
一般忽略第二種情況,概念就變成了:一旦垃圾收集器準備好釋放對象占用的存儲空間(進入第一個回收周期),首先會去調用finalize()方法進行一些必要的清理工作,只有到下一次再進行垃圾回收動作(下一個回收周期)的時候,才會真正釋放這個對象所占用的內存空間。
例子:1)由于在分配內存的時候可能采用了類似 C語言的做法,而非JAVA的通常new做法。這種情況主要發生在native method中,比如native method調用了C/C++方法malloc()函數系列來分配存儲空間,但是除非調用free()函數,否則這些內存空間將不會得到釋放,那么這個時候就可能造成內存泄漏。但是由于free()方法是在C/C++中的函數,所以finalize()中可以用本地方法來調用它。以釋放這些“特殊”的內存空間。2)又或者打開的文件資源,這些資源不屬于垃圾回收器的回收范圍。
System.runFinalization()和System.gc()是做什么的呢? 我個人的理解,這兩個函數分別是應用層向JVM發出一個信號,告訴JVM,希望你能盡快的回收內存和調用對象的finaliztion方法,但是只是一個請求,而JVM只保證會盡最大的努力執行,但是具體什么時候執行以及會不會執行都是未知的。
總結
以上是生活随笔為你收集整理的java finalize 何时被调用_finalize()方法什么时候被调用?析构函数(final的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人体轮廓_她用硅树脂打造反人体曲线的怪诞
- 下一篇: new 一个结构体数组_每天一个IDA小