书上有句话:"你不知道finalize()会不会被调用(即使能确定他调用,也不知道在什么时候调用)",这里的“你不知道finalize()会不会被调用”该怎么理解,不是说对象被回收前一定会调用这个方法吗?
书上有句话:"你不知道finalize()会不会被调用(即使能确定他调用,也不知道在什么时候调用)",这里的“你不知道finalize()会不会被调用”该怎么理解,不是说对象被回收前一定会调用这个方法吗?
1.对象未覆盖 finalize 方法,不执行
2.finalize已经被调用过一次,不执行
3.jvm不保证finalize能完整执行
以上是不一定会被调用,至于确定需要调用的时候会放入f-queue , f-queue 属于低优先级 Finalize 线程,不知道什么时候执行队列,所以不确定什么时候调用。
原文:
即使在可达性分析算法中判定为不可达的对象,也不是“非死不可”的,这时候它们暂时还处于“缓
刑”阶段,要真正宣告一个对象死亡,至少要经历两次标记过程:如果对象在进行可达性分析后发现没
有与GC Roots相连接的引用链,那它将会被第一次标记,随后进行一次筛选,筛选的条件是此对象是
否有必要执行finalize()方法。假如对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用
过,那么虚拟机将这两种情况都视为“没有必要执行”。
如果这个对象被判定为确有必要执行finalize()方法,那么该对象将会被放置在一个名为F-Queue的
队列之中,并在稍后由一条由虚拟机自动建立的、低调度优先级的Finalizer线程去执行它们的finalize()
方法。这里所说的“执行”是指虚拟机会触发这个方法开始运行,但并不承诺一定会等待它运行结束。
这样做的原因是,如果某个对象的finalize()方法执行缓慢,或者更极端地发生了死循环,将很可能导
致F-Queue队列中的其他对象永久处于等待,甚至导致整个内存回收子系统的崩溃。finalize()方法是对
象逃脱死亡命运的最后一次机会,稍后收集器将对F-Queue中的对象进行第二次小规模的标记,如果对
象要在finalize()中成功拯救自己——只要重新与引用链上的任何一个对象建立关联即可,譬如把自己
(this关键字)赋值给某个类变量或者对象的成员变量,那在第二次标记时它将被移出“即将回收”的集
合;如果对象这时候还没有逃脱,那基本上它就真的要被回收了。从代码清单3-2中我们可以看到一个
对象的finalize()被执行,但是它仍然可以存活。
4 回答1.5k 阅读✓ 已解决
4 回答1.3k 阅读✓ 已解决
1 回答2.6k 阅读✓ 已解决
2 回答745 阅读✓ 已解决
2 回答1.7k 阅读
2 回答1.7k 阅读
2 回答1.3k 阅读
因为不知道什么时候对象被回收啊