第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定

深入學(xué)習(xí)JVM 【4】回收“已死”對象的過程

標(biāo)簽:
Java

上篇文章讲到,虚拟机判断一个对象是否可回收是根据“可达性分析”,不可达的对象就是可回收的对象,但是被判定为“不可达的对象”也并非“非死不可”。它们只是被判了“缓刑”,最后是死是生都有可能。

我们看看回收无效对象的过程:

  1. 对象经过可达性分析后,发现没有被GC Roots关联,则会被第一次标记

  2. 判断对象是否覆盖了finalize方法

如果覆盖了该方法,并且该对象的finalize方法还没有执行过。则将这个对象放到F-Queue队列中,稍后虚拟机将启动一个优先级比较低的Finalizer线程去执行finalize方法。

如果没有覆盖该方法,或者说finalize方法已经执行过了,则对象就只能等死(等待垃圾收集器将其回收)

  1. 执行F-Queue队列中等待执行的finalize方法

Finalizer线程执行F-Queue队列中的finalize方法时,将是对象自救的最后一次机会。如果方法的执行使得对象被其他变量或对象所引用,则GC Roots变为可达,GC将会把它移出“即将回收”的对象集合。如果它没有自救,那它就只能等待回收了。

  1. 回收“即将回收”的集合中的所有对象

垃圾回收器将基于其采用的回收算法,对无用对象进行回收。

说说finalize方法

从上面的过程中,可以看出,一个类如果定义了finalize方法,在垃圾回收其实例的过程,会先执行finalize方法。

那么,是不是意味着我们可以再finalize方法中进行资源释放呢?

这样做是很危险的。因为在执行F-Queue队列中的finalize方法时,虚拟机并不承诺完整地执行完整个方法。因为如果finalize方法中执行的操作比较耗时,虚拟机将终止它以保证队列中其他finalize方法能够及时执行。

因此,释放资源还是选择try - finally的方式吧。

另外,对象自救的方法也不建议利用finalize方法,因为finalize只会被系统调用一次,对象可能活过第一次,但是却可能活不过第二次的垃圾回收,因为第二次时finalize将不再执行。

总之,finalize方法了解就好,实际情况中不建议使用。



作者:Coder_Ring
链接:https://www.jianshu.com/p/133cc04d21c9


點擊查看更多內(nèi)容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評論
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學(xué)

大額優(yōu)惠券免費領(lǐng)

立即參與 放棄機會
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報

0/150
提交
取消