JVM-你知道吗,垃圾收集其实是有两次标记过程的,对象能自救吗

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。

第一次肯定是GC Roots可达性分析,如果没有到GC Roots枚举对象的引用链,则被认为是可回收的对象,被标记一次
接下来会进行一次筛选,看这个对象是否要执行finalize()方法,假如没有覆盖finalize()方法,或是finalize()方法已经被执行过了,则不再执行。
如果需要执行finalize()方法,对象会被放到F-Queue中执行,这时收集器会进行第二次的标记,如果这次标记依然被认为是可回收的,那么就认为是垃圾对象,在垃圾收集时被回收了。但是,如果在这个过程中,对象与引用链中的对象成功建立的引用关系,那么他就会被从“即将回收”的集合中移除,不被垃圾回收而幸免。当然这个自救只有一次,因为任何一个对象的finalize()方法都只会被系统自动调用一次。
当然,这只是一个过程,在实际中,finalize()方法是不建议被使用的,因为F-Queue是一个慢队列,并且如果在finalize()方法中执行程序,还有可能造成队列的阻塞,导致内存溢出等问题。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/a13662080711/article/details/108212938