gpt4 book ai didi

java - Soft-/Weak-/PhantomReferences 清除对跟踪对象的引用的基本原理

转载 作者:行者123 更新时间:2023-11-30 05:35:58 25 4
gpt4 key购买 nike

Soft 的文档-,Weak - 和PhantomReference都包含类似于以下内容的行(取自 PhantomReference):

At that time it will atomically clear all phantom references to that object and all phantom references to any other phantom-reachable objects from which that object is reachable.

让我困惑的部分是关于其他幻像可达对象的部分。

如果我理解正确的话,这描述了这种情况:
对象:

  • 一个
  • B

引用文献:

  • ->:强引用
  • -P->:虚拟引用
-> A
-P-> B -> A

因此,出于某种原因,垃圾收集器尚未确定 B 仅是幻像可达的。现在,如果 A 变为幻像可达,并且垃圾收集器检测到这一点,则需要(根据上面引用的文档)清除对 B 的引用。

文档有这样的要求吗?看来如果让其他厂商来开发JVM这会是一个相当大的负担。

最佳答案

我们首先必须注意,这句话是从软引用和弱引用的文档中复制到 Java 9 幻像引用的文档中的,以适应该版本中所做的更改,但不太适合幻像引用,因此对于软引用和弱引用可以更好地解释其背后的基本原理。

假设您有以下情况:

(weak)→ A
(weak)→ B (strong)→ A

从技术上讲,都是 AB是弱可达的,但我们可以通过调用 get() 来改变这一点任一弱引用上的方法,以检索对其所指对象的强引用。

当我们对第一个弱引用执行此操作时,检索对 A 的强引用,对象B将保持弱可达性,但是当我们这样做是为了获得对 B 的强引用时,对象A由于 B 的强引用,也将变得强可达。至A .

因此,我们有这样的规则:如果弱引用A被清除,对 B 的弱引用必须清除,否则可以检索对 A 的强引用通过B尽管对 A 的引用较弱已被清除。为了安全起见,它必须以原子方式发生,因此不存在允许检索对 B 的引用的可能竞争条件。两个引用的间隙之间。

如上所述,这与幻像引用的相关性较小,因为它们不允许检索引用,但没有理由以不同的方式对待它们。

这里的要点是,考虑到垃圾收集器的实际工作方式,这并不是一个实际的负担。他们必须遍历所有 Activity 引用,即强可达对象,并且所有未遇到的对象在每次消除时都是垃圾。所以当遍历的时候遇到弱引用时,不会去遍历引用对象,而是记住引用对象。一旦完成遍历,它将遍历所有遇到的引用对象,并查看引用对象是否已被标记为可通过不同的路径到达。如果没有,则清除引用对象并链接以进行排队。

要解决您的示例:

(strong)→ A
(weak)→ B (strong)→ A

在这里,B无论对 A 的强引用如何,都是弱可达的。当您消除对 A 的强引用时, B仍然是弱可达的并且可能会被排队。正式地,A现在是弱可达的,但是如果没有检测到B,JVM将永远不会检测到它。也是弱可达的。检测该问题的唯一方法 A是弱可达的,可以通过从弱可达 B 开始遍历引用图来实现。 。但没有实现这样做。垃圾收集器将简单地清除对 B 的弱引用。就是这样。

关于java - Soft-/Weak-/PhantomReferences 清除对跟踪对象的引用的基本原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56620616/

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