首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未调用finalize()

未调用finalize()
EN

Stack Overflow用户
提问于 2014-12-16 14:51:07
回答 4查看 648关注 0票数 3

为什么这里不调用finalize()。代码成功编译并运行,但没有任何输出。

代码语言:javascript
复制
package temp;

public class Temp {

    int i;

    Temp(int j) {
        i = j;
    }

    public void finalize() {
        if (i == 10) {
            System.out.println("Finalize called.");
        }
    }

    public static void main(String[] args) {
        Temp obj = new Temp(10);
        System.gc();
    }

}
EN

回答 4

Stack Overflow用户

发布于 2014-12-16 14:53:17

您对System.gc();的调用没有任何区别,因为您的Temp实例有一个引用(obj),所以它不适合进行垃圾收集。

即使它符合垃圾收集的条件,调用System.gc();也不一定会立即收集所有没有引用这些对象的对象。

票数 6
EN

Stack Overflow用户

发布于 2014-12-16 14:55:37

碰巧我正在读Effective Java

第7项:避免FINALIZERS

终结器是不可预测的,通常是危险的,而且通常是不必要的。-Effective Java (第50页)

另一个来自pdf。

不要被System.gc和System.runFinalization方法所诱惑。他们可能会增加终结器被执行的几率,但他们不能保证这一点。唯一声称能保证完成的方法是System.runFi- nalizersOnExit及其邪恶的孪生兄弟Runtime.runFinalizersOnExit。这些方法存在致命缺陷,已被ThreadStop弃用。

基于这一点,使用System.gc只会增加终结器被执行的几率,更重要的是,使用它并不能保证它会运行垃圾收集,它只是向建议

再来一次。

语言规范不仅不能保证终结器会迅速执行,也不能保证终结器会在第二章中执行,创建和销毁对象28。完全有可能,甚至很有可能,程序在不对某些不再可访问的

对象执行终结器的情况下终止

票数 2
EN

Stack Overflow用户

发布于 2014-12-16 14:55:29

添加obj = null;以使引用为空,然后将调用finalize方法。这也不是一个有保证的行为,对我来说,有1-2次我能够在5次中叫到它。

代码语言:javascript
复制
 public static void main(String[] args) {
        Temp obj = new Temp(10);
        obj  = null;
        System.gc();
    }

输出

代码语言:javascript
复制
hi10
Finalize called.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27499077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档