av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

Java 為什么要避免使用finalizer和Cleaner

瀏覽:45日期:2022-08-15 09:03:11

java9之前finalizer,java9使用cleaner代替了finalizer。相比finalizer,cleaner(它存在于一個獨立類Cleaner中,需要時候注入到對應(yīng)類中即可)不會污染API而且cleaner有類庫可以控制它的線程(它兩都在后臺線程中執(zhí)行)。

避免使用的原因:行為的不穩(wěn)定性

它兩都不能保證及時的執(zhí)行,從方法可達到(對象被置空了)開始到最終的執(zhí)行,時間是任意長的。所以千萬不要使用他們來更新重要的持久狀態(tài),如釋放流資源、分布式鎖等。

System.gc和System.runFinalization這兩個方法會增加finalizer和cleaner被執(zhí)行的機會,但是不保證一定會執(zhí)行。唯一能保證它兩會被執(zhí)行的兩個方法(System.runFinalizersOnExit和Runtime.runFinalizersOnExit)有致命的缺陷,已經(jīng)被廢除很久了。

移植性問題

不同的JVM堆垃圾回收的算法不同,如果程序依賴finalizer或者cleaner被執(zhí)行的時間點,那么程序的表現(xiàn)可能截然不同

性能問題

finalizer和cleaner有一個非常嚴重的性能損耗。

安全問題 finalizer中如果出現(xiàn)異常會導致線程終止,但是不會打印線程軌跡甚至警告都不會打印出來,而且使正在銷毀的對象處于破壞狀態(tài),另一個線程如果使用這個破壞狀態(tài)的對象會出現(xiàn)行為的不確定性。cleaner沒有這個問題。 finalizer攻擊:利于finalizer方法,構(gòu)建出惡意子類對象,非法調(diào)用父類方法。final類不會被構(gòu)建惡意子類,所以不會遭到finalizer攻擊。對于非final類,重寫一個空的finalizer方法并用final修飾來防止finalizer攻擊。

//構(gòu)建對象使用后不能再次被實例化public class Demo{ private boolean flag = true; //防止實例化 public Demo() { if (flag){ throw new RuntimeException('不準許再次創(chuàng)建對象'); } } public void say() { System.out.println('DemoUtils.say'); }}//構(gòu)建非法子類class Demo2 extends Demo{ public Demo2(){} //構(gòu)建finalizer攻擊 @Override protected void finalize() throws Throwable { //會調(diào)用父類方法 this.say(); System.exit(0); } public static void main(String[] args) throws InterruptedException { try { //創(chuàng)建子類對象必然會調(diào)用父類構(gòu)造,所以會發(fā)生異常 //但是在gc中還是執(zhí)行了父類的方法 Demo demo = new Demo2(); demo.say(); } catch (Exception e) { System.out.println(e); } System.gc(); //給垃圾回收提供時間 Thread.sleep(5000); }}//運行結(jié)果java.lang.RuntimeException: 不準許再次創(chuàng)建對象DemoUtils.say兩個用處:安全網(wǎng)

當資源的所有者忘記使用close方法的時候,finalizer和cleaner可以充當安全網(wǎng),雖然不能保證及時的釋放資源,但是遲一點釋放總比永遠不釋放要好。要使用這樣的安全網(wǎng)就要認證的考慮清除是否值得付出這樣的代價。所以Java一些AutoCloseable實現(xiàn)中都添加了安全網(wǎng)。

這是FileOutputStream的源碼

Java 為什么要避免使用finalizer和Cleaner

回收本地對等體對象

本地對等體:java操作native方法其實是委托給一個本地對等體對象,使用完成后java對象會被GC回收,但是這個對等體對象不是java對象不會被會GC回收。如果這個對象性能可以接受,而且沒有需要及時釋放的資源那么就可以使用finalizer或者cleaner進行回收了。但是如果這個對等體性能無法接受且擁有必須被及時終止的資源,那么就需要提供一個close方法了。

以上就是Java 為什么要避免使用finalizer和Cleaner的詳細內(nèi)容,更多關(guān)于Java 避免使用finalizer和Cleaner的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Java
相關(guān)文章:
主站蜘蛛池模板: 天天干天天操天天摸 | 黄色激情视频网站 | 亚洲综合视频在线 | 欧美黄色一区 | 狠狠做| 亚洲不卡视频 | 欧美精品一区在线观看 | 中文字幕免费观看视频 | 精品亚洲国产成人av制服丝袜 | 一区二区网站 | 不卡在线 | 亚洲无线观看 | 男女裸体无遮挡做爰 | 一区二区三区久久 | 麻豆精品在线播放 | 欧美日韩精品一区 | 欧美日韩一区二区三区 | 精品视频在线观看免费 | www一级片 | 午夜在线视频观看日韩17c | 成人小视频在线 | 久久精品黄色 | 91精品国产综合久久久久久 | 成人一区二区三区 | 在线观看国产免费视频 | 久久久久国产精品视频 | 三级黄色片网站 | 国产日韩精品一区二区 | 国产精品国产精品国产专区不片 | 涩涩视频免费观看 | 色婷av| 午夜视频免费在线观看 | 在线成人免费视频 | 丁香婷婷在线 | 中文字幕不卡在线 | 欧美成人一区二区三区片免费 | 国产精品一区在线 | 超碰人人艹| av片在线看 | 国产精品免费一区二区三区 | 福利影视 |