- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的问题总结了这一切:
详情如下:
Callum posted this question也是,但没有直接回答。那里的一个回复提到了 Ethan Nicholas 的一篇文章这似乎用“否”回答了我的问题,但我不确定这是正确的。
根据我对 Java API 的阅读,我必须用"is"来回答我的问题:
为了支持这种理解,我将引用 Java Docs :
例如,假设我创建了一个虚引用并将该实例保存在虚引用列表中。然后它的指示对象从强可达变为幻可达。
如果您查看 com.google.common.base.internal.Finalizer.java,您将看到以下代码:
private void cleanUp(Reference reference) throws ShutDown { ... /* * This is for the benefit of phantom references. Weak and soft * references will have already been cleared by this point. */ reference.clear(); ... }
我更希望由对该主题有经验的人来回答,而不是进行网络搜索并向我提供链接。谢谢!
最佳答案
你把两件事搞混了。链接的问题不是关于所指对象,而是关于 PhantomReference
实例。 PhantomReference
实例,与所有引用对象一样,可以像任何其他对象一样被垃圾回收,只要它没有被排队。这在 package specification 中指定:
The relationship between a registered reference object and its queue is one-sided. That is, a queue does not keep track of the references that are registered with it. If a registered reference becomes unreachable itself, then it will never be enqueued. It is the responsibility of the program using reference objects to ensure that the objects remain reachable for as long as the program is interested in their referents.
但是你的问题是关于所指的。此外,引用的代码是关于处理已经入队甚至从队列中检索的引用。
在此处,您引用的文档适用。直到并包括 Java 8,可访问的 PhantomReference
的引用不会被自动清除,因此引用保持幻象可达,直到引用被清除或自身变得不可访问。因此,引用的代码在明确清除引用以允许早期回收方面是正确的,但差异仅影响清理方法执行的持续时间,因为之后,PhantomReference
本身可能变得无法访问。
但这并不是故事的结局。没有明确的理由说明为什么 referents 应该保持 phantom reachable 而不是被回收。毕竟,cleanup 方法无法访问 referent。
因此 Java 9 放弃了该规则并像任何其他引用一样自动清除幻像引用。所以从 Java 9 开始,手动清除已经入队的幻象引用是不必要的,当然,也没有坏处,所以旧软件仍然可以顺利运行。
关于你的例子:
…let's say I make a phantom reference and keep that instance in a List of PhantomReference. Then its referent falls from strongly reachable to phantom reachable.
仅作为 PhantomReference
引用的引用不足以实现幻象可达。它还要求没有强引用并且对象已经完成,尽管大多数对象实际上跳过了完成,因为它们没有自定义 finalize()
方法。当除了幻象引用之外还有软引用时,可能取决于配置和内存需求,引用对象是否变为幻象可达。
关于java - PhantomReference 能否阻止其引用对象进行内存回收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30500316/
我刚开始学习JSP技术,遇到了瓶颈。 如何从 JSP 声明 block ? 这不起作用: ... 服务器说没有“out”。 U: 我确实知道如何使用返回字符串的方法重写代码,但是有没有办法在 ?
在一个字段中,我想设置一个具有自定义过滤器的自定义分析器-着眼于词干-因此,“闪存卡”和“闪存卡”的词根相同,因此返回的结果相同 当我运行以下查询时,我的命中率很高,但是“闪存卡”和“闪存卡”各自返回
快速提问。 我有一个通过 PInvoke 使用 native DLL 的应用程序,这个 DLL 可能会调用 PostQuitMessage()。 如何避免? (因为我的应用程序不应该关闭) 我试过 A
一些给定的 HTML 文章,例如: Content 与一些基本的 Jquery 结合使用,例如: $(".some_
我正在构建一个灯箱相册。当第一个图像加载时,CSS 转换起作用。当加载后的每个图像都没有。任何想法为什么?加载第一张之后的照片,但没有过渡。 Image.prototype.load = functi
这个问题在这里已经有了答案: Disable recent tasks button on Android 5.0 (2 个答案) 关闭 2 年前。 我知道这个问题之前在这里被问过 Android
我是 Objective-C 的新手,我只是想弄清楚我是否可以使用 block 或选择器作为 UIAlertView 的 UIAlertViewDelegate 参数 - 哪个更合适? 我已经尝试了以
我是 Linux (UNIX) 套接字下套接字编程的新手。我在 Internet 上找到了以下代码,用于为每个连接生成一个线程的 tcp 服务器。但是它不起作用。accept() 函数立即返回,不等待
recv()库函数手册页提到: It returns the number of bytes received. It normally returns any data available, up
我有一个用于其他项目的共享 ts 库。在这个库中有被同一个库的其他资源使用的资源。该库的结构分为 components/*、interfaces/*、services/* 等目录。在每个目录的根目录中
我想在同一行中一个接一个地显示我的 ListView ,但 ListView 显示每个新行中的每个项目。我怎样才能防止换行显示。以便它显示为段落 ListView.builder( shr
我有一个包含数千行的表格。 import React from "react" import { useSelector } from "react-redux"; import { useEffec
假设我通常希望收到关于代码中不完整模式的警告,但有时我知道某个函数的模式不完整,我知道这很好。 是still true GHC 的警告粒度是每个模块的,并且没有办法更改有关特定功能或定义的警告? 最佳
我的网络应用程序发送浏览器通知,我知道如何检查通知的浏览器权限,以及如果未授予权限,如何请求权限。 但是,即使用户授予我的站点发送通知的权限,她可能仍然无法收到通知,因为它们 might be dis
我有 Xcode 3.2.1,并且喜欢使用它,但是当我编辑文本中带有超链接的文件时(例如,带有引用的注释:# see http://example.com)Xcode 将文本变成可点击的超链接。尝试编
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
我有一个在 MY_Controller 中运行的 acl。如果权限被拒绝,那么此刻,我只是执行 redirect('denied') - 这是一个非常基本的 Controller ,它加载一个非常基本
我一直很好奇尝试从 Chrome 切换到 Firefox Quantum,但是对于 Web 开发遇到了一个我无法轻松解决的主要障碍——它正在缓存我的本地主机文件,因此当我尝试在本地主机加载各种 emb
这真的让我很兴奋!在任何时候,我都会参与多个项目。当我退出Xcode时,下次打开Xcode时,我前一天的所有项目都会自动一一打开。 经常我最终编辑错误的文件,AHHHHHHHHHHH!我可以阻止这种行
我的Wiki上有500个左右的Spambot和大约5个实际注册用户。我已经使用nuke删除了他们的页面,但是他们一直在重新发布。我已经使用reCaptcha控制了spambot的注册。现在,我只需要一
我是一名优秀的程序员,十分优秀!