gpt4 book ai didi

java - 垃圾回收期间什么时候调用 finalize()?

转载 作者:行者123 更新时间:2023-11-29 04:13:07 29 4
gpt4 key购买 nike

来自:

Q11 https://www.baeldung.com/java-memory-management-interview-questions

当一个对象符合 GC 条件时,垃圾收集器必须对其运行 finalize();此方法保证只运行一次,因此收集器将对象标记为已完成并让它休息直到下一个周期。

我有几个问题要问:

  • 这个说法正确吗?
  • 是否在标记阶段,垃圾收集器是否调用 finalize() 方法?
  • 为什么它会在下一个周期之前休息?

P.S:我知道 finalize() 最终在 Java 9 中被弃用了。感谢好心人决定这样做。

最佳答案

Is it during the marking phase, does the garbage collector invoke the finalize() method?

依赖于实现,但通常没有。终结器在 GC 完成后由后台线程调用。

请记住,GC 可能是一个停止世界的事件,应该尽可能短。 Finalizer 方法可能很慢,因此不应在 GC 期间调用它们。

Why does it give a rest until the next cycle?

在高级别(简化),它的操作如下(有关术语,请参阅 JLS 12.6.1):

  • GC 检测可达的对象:

    • 如果对象有一个终结器方法,将它添加到终结器队列中。
      该对象是可终结的

    • 如果该对象可以从一个finalizable 对象到达,则保留它。
      该对象是finalizer-reachable

    • 否则立即回收内存。
      该对象无法访问

  • 后台终结器线程处理排队的可终结对象:

    • 调用 finalize() 方法。
      当方法返回时,对象完成
  • 由于 GC 已经完成,finalized 对象“静止”直到下一个 GC 周期。

  • 在下一个 GC 周期中,具有标记为finalized 的终结器方法的对象被视为无法访问,并且内存将被回收(假设终结器方法没有'再次使对象可达)。

请注意,当一个对象可终结时,可能会发生许多 GC 周期,即,Finalizer 线程可能需要一段时间来处理该对象。

关于java - 垃圾回收期间什么时候调用 finalize()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53905181/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com