我正在阅读有关 GC 的内容,并了解到当一个对象有资格进行垃圾收集时,GC 必须在其finalize
上运行该方法。该finalize
方法保证只运行一次,因此 GC 将对象标记为已完成并让它休息直到下一个循环。
在 finalize 方法中,您可以从技术上“复活”一个对象,例如,通过将其分配给静态字段。该对象将再次变得活跃并且不符合垃圾回收条件,因此 GC 不会在下一个周期收集它。
但是,该对象将被标记为已完成,因此当它再次符合条件时,将不会调用 finalize 方法。本质上,您只能在对象的生命周期内将这个“复活”技巧转动一次。
我觉得这很有趣。但是,如果我的变量是非静态的,如何将其更改为finalize
方法内的静态?
记住:
如果无法从任何活动线程或任何静态引用访问对象,则该对象符合垃圾收集或 GC 的条件。因此,hack 是将对象添加到finalize
方法内的静态资源中,这样只会阻止一次垃圾收集。该finalize
方法受到保护,因此可以被子类覆盖,无论它们是否在同一个包中。
这是一种危险的做法,无需使用内部应用程序代码。