当前位置: 首页 > 知识库问答 >
问题:

如果垃圾回收器在相同的代码中保留内存两次,是否可以调用finaliz()方法两次?

倪培
2023-03-14

我在很多地方发现,当垃圾收集器或系统启动时,会调用java中的finalize()方法。gc()已成功保留冗余对象消耗的内存,不再对其进行引用。还发现这个方法被调用的次数不超过一次。我对java并不陌生,但也不是很有经验。我可能有一个错误的理解,但让我们说一段代码

public class Solution {
    @Override
    protected void finalize(){
        System.out.print("method called");
    }
    public static void main(String... args){
        Solution obj1= new Solution();
        Solution obj2 = new Solution();
        Solution obj3 = new Solution();
        System.gc();
        obj1=obj2;
        System.gc();
        obj3=null;
        System.gc();
    }
}

这里,finalize方法被调用两次,因为内存堆可以进行两次垃圾清理。所以,我有点困惑,我是否知道整个事情是正确的,或者它是否应该按照它的行为方式进行。

共有1个答案

冷俊健
2023-03-14

否。finalize()方法只会被GC在对象上调用一次。JVM在对象头中设置了一个标志(我认为),表示它已经完成,不会再次完成。

javadoc明确指出:

“对于任何给定对象,Java虚拟机都不会多次调用finalize方法。”

当然,没有什么可以阻止对象方法调用this.finalize()任意次数。

请注意,finalize()。建议您改为使用以下选项之一:

  • 可自动关闭尝试使用资源

有人这样评论:

为收集的每个对象调用finalize()

这不是真的,有几个原因。

>

垃圾收集对象可能无法最终确定的一种情况是,如果JVM在GC运行后不久退出。

另一种(病理性)情况是,类finalize方法从未返回1。当该类的实例被终结时,终结器线程将被卡住。当所有终结器线程都以这种方式卡住时,就不能终结更多的可终结对象2

如果在类中没有重写对象::finize,JVM将跳过该类的终结步骤。

1-这可能是由于无限循环,或者是因为finalize()方法在等待锁或等待从未发生的内部或外部“事件”时卡住。还请注意,在这种情况下,“从不”可能意味着“不会很长时间”。总体影响可能是相同的
2-对象将无限期地位于终结队列中。这是内存泄漏

 类似资料:
  • 问题内容: 我正在读取一个很大的文件,并从每一行中提取文本的一小部分。但是,在操作结束时,我的工作记忆很少。似乎垃圾收集器在读取文件后无法释放内存。 我的问题是:有什么办法释放这种记忆?还是这是JVM错误? 我创建了一个SSCCE来演示这一点。它读取一个1 mb(由于16位编码,在Java中为2 mb)的文件,并从每行中提取一个字符(约4000行,因此大约为8 kb)。测试结束时,仍将使用全部2

  • 嗨,根据这里的留档https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/concurrent.html#mostly_concurrent热点JVM有两个并发收集器——CMS和G1。所以在垃圾回收机制中,这两个是并行使用的,还是只选择了一个?

  • 问题内容: 和 第二个代码产生了一个空指针异常,该怎么做才能使下一个等效? 问题答案: 我可以看到,如果players某个自定义java.lang.Iterable的get()实现的实现被破坏,或者至少以一种异常的方式(与的行为不同),就会发生这种情况。 除此之外,我唯一能想到的就是您未在代码中向我们展示的某些内容导致了某些错误。 如果执行此操作会怎样?

  • 问题内容: 我有使用JQuery..I米一个问题在我的代码发送字段名和序列号,其通过获取其数据的ctrller 和并且与序列表中没有given..And生成预览显示面板更新字段名与插入的字段..现在,我再次尝试更改字段名称。tat是现在,当我单击生成的显示面板字段时,相应的设置将打开,我将尝试立即更改字段名称 两者和都相同..在我发送的是字段名和序列号 在功能2中,我要发送相同的字段名和(但其他值

  • 问题内容: 我有一个Java应用程序正在泄漏内存。我知道在垃圾回收期间哪些对象没有被释放,但是我无法确定引用它们的对象。 JVM内部保存的对象图是否具有某种可见性? 否则就有可能找出哪些对象引用了另一个对象? 问题答案: 在真正的基础上,您可以使用命令jhat和jmap从正在运行的Java进程中读取堆文件,然后对其进行处理- 它在本地端口上启动小型Web服务器。它并不是很容易阅读,但是您不必购买分

  • 本文向大家介绍请简单描述一下垃圾回收器的基本原理是什么?还有垃圾回收器可以马上回收内存吗?并且有什么办法可以主动通知虚拟机进行垃圾回收呢?相关面试题,主要包含被问及请简单描述一下垃圾回收器的基本原理是什么?还有垃圾回收器可以马上回收内存吗?并且有什么办法可以主动通知虚拟机进行垃圾回收呢?时的应答技巧和注意事项,需要的朋友参考一下 考察点:垃圾回收 对于GC来说,当程序员创建对象时,GC就开始监控这