關於finalize機制和援用、援用隊列的用法詳解。本站提示廣大學習愛好者:(關於finalize機制和援用、援用隊列的用法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是關於finalize機制和援用、援用隊列的用法詳解正文
C++有析構函數這個器械,可以或許很好地在對象燒毀前做一些釋放內部資本的任務,然則java沒有。Object.finalize()供給了與析構函數相似的機制,然則它不平安、會招致嚴重的內存消費和機能下降,應當防止應用。best practice是:像java類庫的IO流、數據庫銜接、socket一樣,供給顯示的資本釋放接口,法式員應用完這些資本後,必需要顯示釋放。所以可以忘卻Object.finalize()的存在。JVM啟動的時刻,會創立一個Finalizer線程來支撐finalize辦法的履行。
關於援用和援用隊列,java供給了4種援用類型,在渣滓收受接管的時刻,都有本身各自的奇特表示。ReferenceQueue是用來合營援用任務的,沒有ReferenceQueue一樣可以運轉。創立援用的時刻可以指定聯系關系的隊列,當GC釋放對象內存的時刻,會將援用參加到援用隊列,這相當因而一種告訴機制。當聯系關系的援用隊列中稀有據的時刻,意味著援用指向的堆內存中的對象被收受接管。經由過程這類方法,JVM許可我們在對象被燒毀後,做一些我們本身想做的工作。JVM供給了一個ReferenceHandler線程,將援用參加到注冊的援用隊列中。
finalze機制是先履行Object.finalize()中的邏輯,後燒毀堆中的對象;援用和隊列機制,先燒毀對象,後履行我們本身的邏輯。可以看到:應用援用和隊列機制效力更高,由於渣滓對象釋放的速度更快。假如是監控對象的燒毀,那末最合適的是鬼魂援用,如sun.misc.Cleaner就是應用鬼魂援用,到達監控對象燒毀的目標,NIO中應用的就是這個。
以上這篇關於finalize機制和援用、援用隊列的用法詳解就是小編分享給年夜家的全體內容了,願望能給年夜家一個參考,也願望年夜家多多支撐。