“这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战”
☀️引言
上回说到可达性分析算法,只要是不可达对象就会被回收,那是不是直接就判处死刑了呢,有没有缓刑的机会呢?嘻嘻,今天我们就来聊聊这块。
☀️对象的判决
即使被标记为不可达对象,那也不是立即就会上法场的,还要有一次判决。就是说要宣布对象的死亡,你至少得经历两个过程:如果对象在进行可达性分析时没有发现对应的引用链,那就进行一次标记,好了,这个时候对象已经被标记为准垃圾了,之后还要进一步筛选,看什么呢?看该对象是否有必要执行finalize()
方法,那怎么看呢?如果对象没有覆盖了finalize()
方法,或者该方法调用过,那这两种情况就是没有必要执行了。
❄️finalize()方法
如果该对象被判定有必要执行finalize()
方法,该对象就会被塞进一个F-Queen
的队列中,稍后由虚拟机派一个自己的小弟😮,低调度优先级的Finalize
线程,去执行该对象本身的finalize()
方法,需要说明的是虚拟机只是触发这个方法的执行,并不会一直等待,就是为了确保万一自己的小弟喝醉了想偷懒,那F-Queen
的队列里的其他对象都会等着,极端点会导致整个回收子系统的崩溃。
❄️finalize()方法作用(面试题)
finalize()
方法是对象和死神求生的最后机会,如果在此期间和GC Roots
的引用链上任意一个对象建立关系,那第二次标记的时候就会移除等待回收的集合,证明了你是个好人,但是不会给你发好人卡,而是准好人卡,一旦下次又被标记,就不会执行自救方法了。
☀️敲黑板
需要注意的是finalize()
能做的,使用try-finally
都能做,而且比它做的更好,所以建议大家忘掉这个方法。
☀️题外话
很多时候我们生活中的烦恼都是对自己状态的不满意造成的,觉得自己愧对自己,又不肯发生根本上的改变,只好把这份怨言推卸在丈夫、家人和父母的身上,常见的话语就是:人家人家怎么怎么样,所以送大家16字
真言就是:
- 扎实奋进
- 务实承担
- 付出收获
- 平常真实