JVM学习日记🎈垃圾回收之对象判决

356 阅读2分钟

“这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战

☀️引言

上回说到可达性分析算法,只要是不可达对象就会被回收,那是不是直接就判处死刑了呢,有没有缓刑的机会呢?嘻嘻,今天我们就来聊聊这块。

☀️对象的判决

即使被标记为不可达对象,那也不是立即就会上法场的,还要有一次判决。就是说要宣布对象的死亡,你至少得经历两个过程:如果对象在进行可达性分析时没有发现对应的引用链,那就进行一次标记,好了,这个时候对象已经被标记为准垃圾了,之后还要进一步筛选,看什么呢?看该对象是否有必要执行finalize()方法,那怎么看呢?如果对象没有覆盖了finalize()方法,或者该方法调用过,那这两种情况就是没有必要执行了。

❄️finalize()方法

如果该对象被判定有必要执行finalize()方法,该对象就会被塞进一个F-Queen的队列中,稍后由虚拟机派一个自己的小弟😮,低调度优先级的Finalize线程,去执行该对象本身的finalize()方法,需要说明的是虚拟机只是触发这个方法的执行,并不会一直等待,就是为了确保万一自己的小弟喝醉了想偷懒,那F-Queen的队列里的其他对象都会等着,极端点会导致整个回收子系统的崩溃。

❄️finalize()方法作用(面试题)

finalize()方法是对象和死神求生的最后机会,如果在此期间和GC Roots的引用链上任意一个对象建立关系,那第二次标记的时候就会移除等待回收的集合,证明了你是个好人,但是不会给你发好人卡,而是准好人卡,一旦下次又被标记,就不会执行自救方法了。

☀️敲黑板

需要注意的是finalize()能做的,使用try-finally都能做,而且比它做的更好,所以建议大家忘掉这个方法。

☀️题外话

很多时候我们生活中的烦恼都是对自己状态的不满意造成的,觉得自己愧对自己,又不肯发生根本上的改变,只好把这份怨言推卸在丈夫、家人和父母的身上,常见的话语就是:人家人家怎么怎么样,所以送大家16字真言就是:

  • 扎实奋进
  • 务实承担
  • 付出收获
  • 平常真实