Java終止函數是什麼?
對於對象而言Java 終止函數履行最後的確認工作這與Java 構造函數是相反的Java 構造函數創建以及初始化了一個Java類實例當一個對象不在被需要以及這些資源必須被用於其它對象的時候在一個類實例或者發行的系統資源比如說文件描述符或者網絡 <;接口連接上Java 終止函數可以被用來清除任務你不需要證據或者為終止函數返回任何值遺憾的是當一個類或者接口被載入的時候目前的Java語言的介紹中沒有任何關於終止函數用於Java類或者接口的解釋讓我們進一步研究一下javalang對象的終止函數finalize()方法提供一個方法實例(如何使用PHP中的Clone函數)
protected void finalize() throws Throwable
當一個Java對象不再被需要的時候這個對象原先占有的空間就會期望能夠自動的由Java回收工具進行回收利用這在Java中有著顯著的差異並且在大多數的結構性程序語言比如說C語言中是不常見的如果一個類實例實施終止函數finalize()方法它所占用的空間就不能及時的被回收工具重新回收利用最壞的情況是也許它根本就不再被回收了任何實施終止函數finalize() 方法的類實例都經常調用終止對象當它們不再被引用的時候它們不能立即被Java回收工具回收為最終程序Java回收工具將對象附加到指定的隊列通常是由一個指定的線性程序執行的在一些Java虛擬機上被稱為參考句柄在最終程序階段終止函數線性程序會執行每一個對象的終止函數finalize()方法finalize() 成功執行之後Java回收工具將會交付對象將它所占用的空間由future碎片收集功能再生我沒有說現有這意味著至少兩個碎片收集周期必須被要求用來回收終止對象聽起來這像是有一些消耗的?正確我們需要一些方法使得空間能夠重新利用(Java新的垃圾回收器需購買支持後才能用)
線性終止函數在系統中沒有被給予最大優先權優先級更高的線程導致終止對象被排列如果一個線性終止函數無法與這個效率保持一致終止函數隊列就會持續增長導致Java堆不停的被堆積最終Java堆將會被耗盡並且javalangOutOfMemoryError將會被拋出
對於任何對象而言一個Java虛擬機將不會超過一次的引用終止函數finalize()方法如果finalize()方法拋出了什麼例外現象對象的終止程序就會停止下來
對於類的finalize()方法你幾乎可以自由的做任何事情當你這樣做的時候當對象不再被引用或者不再需要的時候請不要期望存儲 <;空間會被任何一個由Java回收程序回收再生的對象占領為什麼? finalize()方法將要完整的按進度完成的這種情況是不可控的最壞的情況是當這裡沒有更多涉及到對象的時候也許它甚至不會被解決這意味著任何具有finalize()方法的對象被回收都是無法被保障的這是內存 <>管理發展的一個潛在危險不必多說有相當大的開銷是花費在隊列排列運行finalize()方法以及將對象反射到下一個碎片整理環節上的
如果你想在對象上運行函數考慮到終止函數作為最後一個方法執行你自己的清理垃圾方法這將會更加的平穩完全信任終止函數來進行事後的垃圾清理工作是非常危險的特別是當你的終止對象涉及到本地資源的時候
Java 終止函數的實際操作體驗
ObjectWYieldFinalizer內我們可以伴隨著線性yield()執行finalize()方法這樣finalize()就不能完全執行見代碼表一線性yield()方法從正在運行的程序中阻止現有的線性程序執行以及允許其它的線性程序執行如果終止函數線性程序調用這種finalize()方法它將會暫停執行
代碼表一
/*
* @Author : Jinwoo Hwang
* (C) Copyright IBM Corp All Rights Reserved
*/
public class ObjectWYieldFinalizer {
protected void finalize() throws Throwable {
Threadyield();
}
}
public class TestObjectWYieldFinalizer {
public static void main(String[] args) {
while(true){
ObjectWYieldFinalizer o = new ObjectWYieldFinalizer();
}
}
}
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27113.html