国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Java禁止使用finalize方法

Java禁止使用finalize方法

2021-01-18 09:41動力節(jié)點(diǎn) Java教程

這篇文章主要介紹了Java禁止使用finalize方法,需要的朋友可以參考下

什么是finalize方法

finalize()方法被定義在Java.lang.Object類中,意味著所有的類都可以重載這個方法。java垃圾回收器只之道釋放那些經(jīng)由new分配的內(nèi)存,所以如果你的對象并非通過new獲得的內(nèi)存,那么垃圾回收器就不知道如何釋放該對象的內(nèi)存了。

為了應(yīng)對這種情況,java允許在類中重載java.lang.Object類中的finalize()方法。

它的工作原理:一旦垃圾回收器準(zhǔn)備好釋放對象占用的存儲空間,將首先調(diào)用其finalize()方法,并且在下一次垃圾回收動作發(fā)生時,才會真正回收對象占用的內(nèi)存。

finalize函數(shù)的調(diào)用機(jī)制

java虛擬機(jī)規(guī)范并沒有硬性規(guī)定垃圾回收該不該搞,以及該如何搞。所以這里提到的調(diào)用機(jī)制不能保證適合所有jvm。

何時被調(diào)用?

  finalize啥時候才會被調(diào)用捏?一般來說,要等到JVM開始進(jìn)行垃圾回收的時候,它才有可能被調(diào)用。而JVM進(jìn)行垃圾回收的時間點(diǎn)是非常不確定的,依賴于各種運(yùn)行時的環(huán)境因素。正是由于finalize函數(shù)調(diào)用時間點(diǎn)的不確定,導(dǎo)致了后面提到的某些缺點(diǎn)。

誰來調(diào)用?

  常見的JVM會通過GC的垃圾回收線程來進(jìn)行finalize函數(shù)的調(diào)用。由于垃圾回收線程比較重要(人家好歹也是JVM的一個組成部分嘛),為了防止finalize函數(shù)拋出的異常影響到垃圾回收線程的運(yùn)作,垃圾回收線程會在調(diào)用每一個finalize函數(shù)時進(jìn)行try catch,如果捕獲到異常,就直接丟棄,然后接著處理下一個失效對象的finalize函數(shù)。

為什么禁止使用finalize()

1.調(diào)用時間不確定---有資源浪費(fèi)的風(fēng)險(xiǎn)

前面已經(jīng)介紹了調(diào)用機(jī)制。同學(xué)們應(yīng)該認(rèn)清“finalize的調(diào)用時機(jī)是很不確定的”這樣一個事實(shí)。所以,假如你把某些稀缺資源放到finalize()中釋放,可能會導(dǎo)致該稀缺資源等上很久很久很久以后才被釋放。這可是資源的浪費(fèi)??!另外,某些類對象所攜帶的資源(比如某些JDBC的類)可能本身就很耗費(fèi)內(nèi)存,這些資源的延遲釋放會造成很大的性能問題。

2.可能不被調(diào)用----有資源泄露的風(fēng)險(xiǎn)

很多同學(xué)以為finalize()總是會被調(diào)用,其實(shí)不然。在某些情況下,finalize()壓根兒不被調(diào)用。比如在JVM退出的當(dāng)口,內(nèi)存中那些對象的finalize函數(shù)可能就不會被調(diào)用了。

估計(jì)有同學(xué)在打“runFinalizersOnExit”的主意,來確保所有的finalize在JVM退出前被調(diào)用。很可惜也很遺憾,該方法從JDK 1.2開始,就已經(jīng)被廢棄了。即使該方法不被廢棄,也是有很大的線程安全隱患滴!   

從上述可以看出,一旦你依賴finalize()來幫你釋放資源,那可是很不妙啊(有資源泄漏的危險(xiǎn))!很多時候,資源泄露導(dǎo)致的性能問題更加嚴(yán)重,萬萬不可小看。

3.對象可能在finalize函數(shù)調(diào)用時復(fù)活

本來,只有當(dāng)某個對象已經(jīng)失效(沒有引用),垃圾回收器才會調(diào)用該對象的finalize函數(shù)。但是,萬一碰上某個變態(tài)的程序員,在finalize()函數(shù)內(nèi)部再把對象自身的引用(也就是this)重新保存在某處,也就相當(dāng)于把自己復(fù)活了(因?yàn)檫@個對象重新有了引用,不再處于失效狀態(tài))。 為了防止發(fā)生這種詭異的事情,垃圾回收器只能在每次調(diào)用完finalize()之后再次去檢查該對象是否還處于失效狀態(tài)。這無形中又增加了JVM的開銷。隨便提一下。由于JDK的文檔中規(guī)定了,JVM對于每一個類對象實(shí)例最多只會調(diào)用一次finalize()。所以,對于那些詐尸的實(shí)例,當(dāng)它們真正死亡時,finalize()反而不會被調(diào)用了。這看起來是不是很奇怪?

4.要記得自己做異常捕獲

剛才在介紹finalize()調(diào)用機(jī)制時提到,一旦有異常拋出到finalize函數(shù)外面,會被垃圾回收線程捕獲并丟棄。也就是說,異常被忽略掉了(異常被忽略的危害,“這里”有提到)。為了防止這種事兒,凡是finalize()中有可能拋出異常的代碼,你都得寫上try catch語句,自己進(jìn)行捕獲。

5.小心線程安全

由于調(diào)用finalize()的是垃圾回收線程,和你自己代碼的線程不是同一個線程;甚至不同對象的finalize()可能會被不同的垃圾回收線程調(diào)用(比如使用“并行收集器”的時候)。所以,當(dāng)你在finalize()里面訪問某些數(shù)據(jù)的時候,還得時刻留心線程安全的問題。

總結(jié)

以上所述是小編給大家介紹的Java禁止使用finalize方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對服務(wù)器之家網(wǎng)站的支持!

原文鏈接:http://blog.sina.com.cn/s/blog_9c6852670102wxbc.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 操她视频网站 | 亚洲专区中文字幕 | 先锋av资源 | 日韩一区二区三区在线 | 日韩成人精品 | 日本高清视频网站www | 欧美 日韩 综合 | 国产精品久久影院 | 欧美九九 | 亚洲精品一区 | 成人精品久久 | 免费看一区二区三区 | 激情综合五月天 | 国产深夜视频在线观看 | 一级毛片免费版 | 久久国内 | 国产精品久久久久久久久久久久冷 | 国产精品久久九九 | 日本一区二区免费在线观看 | 99热婷婷 | 成人黄色av | 日韩欧美在线播放 | 中文字幕二区 | 91在线视频在线 | 一区二区在线 | 日本免费在线观看 | 日韩欧美专区 | 久草成人网 | 中文字幕在线一区二区三区 | 国内精品久久久久久中文字幕 | 蜜桃视频 精品区 | 日韩欧美手机在线 | 成人av一区二区三区 | 久久丁香| 99视频免费 | 中文字幕一区在线观看视频 | 91精品国产一区二区三区 | 精品久久国产 | 综合久久久久 | 久草久 | 欧美精品一区二区三区在线播放 |