问题标签 [phantom-reference]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3339 浏览

java - 了解关于引用队列的幻像引用与弱引用

根据链接https://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html,只有当对象从内存中物理移除并且WeakReferences在最终确定或垃圾收集之前入队时, PhantomReferences才会入队实际发生了。

不同之处在于排队发生的确切时间。一旦弱引用指向的对象变得弱可达,弱引用就会被排队。这是在最终确定或垃圾收集实际发生之前;理论上,对象甚至可以通过非正统的 finalize() 方法“复活”,但 WeakReference 将保持死态。仅当对象从内存中物理删除时,PhantomReferences 才会入队,并且 get() 方法始终返回 null 专门用于防止您能够“复活”几乎死掉的对象。

而根据http://www.ibm.com/developerworks/library/j-refs/,在释放堆对象之前将PhantomReference添加到其ReferenceQueue中,并且在完成或垃圾回收之后将WeakReferences添加到其 ReferenceQueue 中。

与软引用和弱引用不同,PhantomReference 在堆对象被释放之前被添加到它的 ReferenceQueue 中。(请记住,所有 PhantomReference 对象都必须使用关联的 ReferenceQueue 创建。)这允许在回收堆对象之前采取行动。

当堆对象的 finalize() 方法运行并释放其内存时,WeakReference 对象将添加到其 ReferenceQueue(如果存在)。

我很困惑。哪一个是正确的?

基本上我想知道关于引用队列的弱引用和幻像引用之间的区别?

0 投票
1 回答
122 浏览

java - PhantomReference 和 ReferenceQueue 是什么关系?

我对 java 中的 PhantomReference 有点困惑。当我查看在线文章时,他们中的大多数都提到 PhantomReference 对象在创建后将返回 null 即使我们在引用上调用 get() 并且它还提到当 PhantomReference 被删除时,对象是幻影可访问的将被插入到 ReferenceQueue 中记忆。

我已经尝试了以下代码示例,但我对结果感到困惑。

以上两个语句打印空。如果 pr.get() 返回 null 是否意味着 pr 引用的对象被垃圾收集?如果是这样,为什么对象仍未添加到优先级队列中?

任何人都可以帮助我澄清这一点。如果我对 PhantomReference 和 ReferenceQueue 的理解有误,我向您道歉。

请简单描述这两个术语

多谢

0 投票
1 回答
396 浏览

java - PhantomReference 可以阻止其引用对象进行内存回收吗?

我的问题总结了这一切:

  • 强可达 Java PhantomReference 能否阻止垃圾收集器 (GC) 回收其引用对象的内存?

详情如下:

Callum 也发布了这个问题,但没有直接回答。那里的一个回复是指Ethan Nicholas的一篇文章,该文章似乎用“否”回答了我的问题,但我不确定这是正确的。

根据我对 Java API 的阅读,我必须用“是”回答我的问题:

  • 只要不调用 PhantomReference.clear(),并且 PhantomReference 实例本身仍然被强引用,则永远不会回收引用对象的内存,并且引用对象将保持在幻像可达状态。

为了支持这种理解,我将引用Java Docs

  • “与软引用和弱引用不同,幻像引用在入队时不会被垃圾收集器自动清除。通过幻像引用可访问的对象将保持不变,直到所有此类引用都被清除或它们本身变得不可访问。”

例如,假设我创建了一个幻像引用并将该实例保存在 PhantomReference 列表中。然后它的所指对象从强可达下降到幻象可达。

如果您查看 com.google.common.base.internal.Finalizer.java,您将看到以下代码:

我更喜欢有经验的人来回应,而不是进行网络搜索并为我提供链接。谢谢!

0 投票
1 回答
88 浏览

java - java中虚引用的重要性

我想以粗体理解以下声明。这是什么意思?(链接

覆盖的对象finalize()现在必须在至少两个单独的垃圾收集周期中被确定为垃圾才能被收集。当第一个循环确定它是垃圾时,它就有资格进行终结。由于对象在最终确定期间“复活”的可能性(很小,但不幸的是真实的),垃圾收集器必须再次运行,然后才能实际删除对象。并且因为终结可能没有及时发生,所以在对象等待终结时可能发生了任意数量的垃圾回收周期。这可能意味着实际清理垃圾对象的严重延迟,这就是为什么OutOfMemoryError即使大部分堆都是垃圾也可以获得 s 的原因。

幻影参考解决了什么

使用 PhantomReference,这种情况是不可能的——当 PhantomReference 入队时,绝对没有办法获得指向现在已死对象的指针(这很好,因为它不再在内存中)。因为 PhantomReference 不能用于复活一个对象,所以可以在第一个垃圾回收周期中立即清理该对象,在该周期中发现它是幻影可访问的。

请帮助我了解问题和解决方案

谢谢

0 投票
2 回答
118 浏览

java - 如何使用 PhantomReference 报告 Android/Java 中的内存泄漏

在重建了我曾经写过的一段旧代码之后,然后忘记了,现在重写了……我把它作为一个 wiki 放在这里,供所有人使用:-)

所以,基本上:如果你在一个复杂的 Android 应用程序中出现内存泄漏,包含图像和交叉引用。您将如何去查找哪些(类型)对象正在泄漏?Android SDK 提供了一些(很难学习和使用)工具。可能还有更多我不知道的。然而,Java 确实提供了 PhantomReference 作为执行此操作的一种手段,即使经历设置所需类所需的混乱可能需要很多工作(而且也很讨厌...... JDK-8034946)。

但是最简单/最有效的方法是什么?我的解决方案如下。

0 投票
1 回答
312 浏览

java - 使用 PhantomReference 的示例

QueueReference据我所知,当引用指向的对象被删除时,引用就会落入。

这是我即将演示的示例,但它不起作用。里面的代码if从来没有被执行过。这是什么意思。我用错了吗?或者GarbageCollector在执行过程中没有工作?

0 投票
1 回答
219 浏览

java - Java、webdriver、phatom.js 无法找到元素 ajax 调用 - 页面上的响应

首先,我要感谢您的阅读并感谢您提供可能的解决方案。

我在 ajax 调用后查找元素时遇到问题 - 页面上的响应。我使用 Java、webdriver 和 phantom.js 作为工具。

在我的情况下,phantom.js 只有在页面上有 iframe 时才能访问 webelement。

如果我没有框架并等待 ajax 响应,phantom.js 在空白页面上搜索元素。

我的问题是,如何在没有 iframe 的情况下使用 selenium webdriver、java 和 phantom.js 等待来自 ajax 响应的所有内容?或者 phantom.js 在 ajax 响应期间如何搜索元素。使用 Chrome 驱动程序,我的测试工作正常。

在这个问题之前,我在 stackoverflow、google 上找到了可能的答案,但我没有找到足够的解决方案。

0 投票
1 回答
352 浏览

java - GC 期间未释放幻像引用

我对幻像引用的使用感到有些困惑。我读到,只要垃圾收集器喜欢它,就可以收集只有 Phantom 引用指向它们的对象。但是,它没有按我的示例中的预期工作。

在上面的示例中,当我运行时,我看到对象“strong”不是自动收集的垃圾。我希望当“强”对象分配给 null 时,该对象会自动收集垃圾。奇怪的是,只有当我在 register 函数中取消注释以下行时,它才会被垃圾收集。

这背后的原因是什么?但是,如果我在 Main 函数本身中创建幻像引用,则不会发生此问题。换句话说,当在 main 函数中将“strong”分配给 null 时,对象会自动被垃圾收集,如下面的代码所示。

为什么两种情况下的行为不同?

0 投票
2 回答
1477 浏览

java - 参考队列的含义

我试着理解课堂ReferenceQueue

它是可选的构造函数参数

它也是PhantomReference.

根据我读过的信息,我可以写一些论文

a) 对于 PhantomReference 方法 get 总是返回 null

b) 对于 Phantom 引用:
1. gc 检测到可以从内存中删除对象
2. 当我们调用 clear 或链接到来自队列的引用时对放入 ReferenceQueue 的对象的引用
变得无法访问,并且 gc 看到 3. finalize 方法调用
4.
为弱/软引用释放内存:
1. gc 检测到可以从内存中删除对象
2. 完成方法调用
3. 释放内存
4. 对放入队列的对象的引用

  1. 什么时候可以将第二个参数传递给XXXReference构造函数?
  2. 我可以得到哪些帮助?
  3. 为什么PhantomReference没有没有构造函数ReferenceQueue
  4. ReferenceQuee 的 get 方法总是返回 null 的原因是什么?
0 投票
1 回答
436 浏览

java - 具有空队列的 PhantomReference

Java允许编写:

在这种情况下new Object()会被收集吗?

据我了解,幻影参考是finalize() 方法使用的替代方法。

在队列中出现参考后,我需要做一些额外的动作然后运行clear()

java doc 保留:

可以使用空队列创建幻像引用,但这样的引用完全没有用:它的 get 方法将始终返回 null,并且由于它没有队列,因此永远不会入队

如果它永远不会入队是什么意思?

据我了解,这意味着在 finalize 方法调用之后不会将引用添加到 referenceQueue 中。因此可能会导致:
1. 对象内存将被立即清除
2. 对象内存不会被清除

哪种情况正确?