gpt4 book ai didi

java - 哪个引用终结器(FinalReference)或弱/幻影/软引用对于GC具有更高的优先级

转载 作者:行者123 更新时间:2023-11-30 01:45:23 25 4
gpt4 key购买 nike

当创建具有重要finalize()方法的对象时,JVM将创建Finalizer(FinalReference)并以此对象作为引用。如果这个对象也被软引用/弱引用或幻像引用包装,会发生什么? GC 是否会首先尝试将 Finalizer 入队(对其调用 Finalize 方法),然后将另一个 Reference 入队或相反?

最佳答案

我想,你的问题其实不是排队时间的问题。

考虑 the package documentation通知部分

Some time after the garbage collector determines that the reachability of the referent has changed to the value corresponding to the type of the reference, it will add the reference to the associated queue.

(注意“一段时间后”)

同样,所有引用类型都有以下形式的语句:

Suppose that the garbage collector determines at a certain point in time that an object is weakly reachable. At that time it will atomically clear all weak references to that object and all weak references to any other weakly-reachable objects from which that object is reachable through a chain of strong and soft references. At the same time it will declare all of the formerly weakly-reachable objects to be finalizable. At the same time or at some later time it will enqueue those newly-cleared weak references that are registered with reference queues.

(摘自WeakReference;注意“同时或稍后”)

实际上,垃圾收集器将发现的引用移交给另一个异步排队的线程。由于未指定的延迟使得应用程序从队列中检索引用的顺序不确定,因此在这里询问顺序是没有意义的。

但是,我想,您实际上对另一个“某个时间点”感兴趣,当“垃圾收集器确定引用对象的可达性已更改为值时对应于引用的类型”,并将决定以原子方式清除引用并使它们符合排队条件。

当混合存在多个不同类型的引用对象(包括 Finalizer 引用)但没有强引用时,有两种可能的情况:

  1. 至少有一个软引用,并且没有内存压力。然后,垃圾收集器可能会决定不明确。将任何引用排队。
  2. 没有软引用,或者垃圾收集器认为内存压力需要清除软引用。然后所有软引用和弱引用都被清除,所有软引用、弱引用和终结器引用都被移交给队列。
    只有虚拟引用保持不变。

请注意,一旦终结开始,就不再有 Finalizer 引用,但在终结期间,可能会创建新的软引用或弱引用。因此,最终的场景与优化处理具有简单 finalize() 方法的对象相同。可以混合使用软引用、弱引用和幻像引用,但没有 Finalizer 引用。当没有剩余的强引用时,我们再次有两种可能的情况:

  1. 至少有一个软引用,并且没有内存压力。然后,垃圾收集器可能会决定不明确。将任何引用排队。
  2. 没有软引用,或者垃圾收集器认为内存压力需要清除软引用。然后所有软引用、弱引用和幻像引用都被清除A,并且所有软引用、弱引用和幻像引用都被移交给队列。

A 幻像引用在 Java 9 或更高版本中被清除。在以前的版本中,它们仅入队而不会被清除。

关于java - 哪个引用终结器(FinalReference)或弱/幻影/软引用对于GC具有更高的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58225656/

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