当前位置: 首页 > 面试题库 >

您是否在任何项目中使用过PhantomReference?

余铭晨
2023-03-14
问题内容

我唯一了解的PhantomReference

  • 如果使用其 get() 方法,它将始终返回null而不是对象。它有什么用?
  • 通过使用PhantomReference,您可以确保无法从 finalize 方法中恢复该对象。

但是这个概念/类的用途是什么?

您是否曾在您的任何项目中使用过此功能,或者在任何示例中应使用此功能?


问题答案:

PhantomReference在简单,非常专业的内存分析器中使用s来监视对象的创建和销毁。我需要他们追踪破坏。但是这种方法已经过时了。(它于2004年针对J2SE1.4编写。)专业的分析工具功能更强大,更可靠,并且JMX或代理和JVMTI等新的Java 5功能也可以用于此目的。

PhantomReferences(始终与Reference队列一起使用)优于s,finalize但存在一些问题,因此应避免使用。主要是使对象再次可达。这可以通过终结器保护语来避免(->在’EffectiveJava’中了解更多信息)。因此它们也是 新的定稿

此外,PhantomReferences

使您可以准确确定何时从内存中删除对象。实际上,它们是确定这一点的唯一方法。通常这没有什么用处,但是在某些非常特殊的情况下(例如处理大图像)可能会派上用场:如果您确定应该对图像进行垃圾回收,则可以等到它实际加载后再尝试加载下一个图像,因此避免发生可怕的OutOfMemoryError的可能性。(引自尼古拉斯。)

就像psd首先写的那样,罗迪·格林(RoedyGreen)有很好的参考文献摘要。



 类似资料:
  • 问题内容: Quickcheck及其变体(甚至Java中也没有)似乎很有趣。但是,除了学术兴趣之外,它在实际的应用程序测试中是否真的有用(例如GUI应用程序或Client / Server甚至是StackOverflow本身)?您使用类似的测试生成器的任何经验都将受到赞赏。 问题答案: 好吧。其实没有,但是我是在最初开发QuickCheck的那个人的带领下学习的,他是一个非常有趣的人。 早在200

  • 问题内容: 我正在尝试设置一些环境变量(用于对dev / prod端点进行API调用,取决于dev / prod等的键等),我想知道使用dotenv是否行得通。 我已经安装了dotenv,并且正在使用webpack。 我的webpack条目是,因此在该文件中 然后,在我的webpack配置中,输入以下内容: 但是,它仍未定义。如何正确执行此操作? 问题答案: 最简洁的答案是不。浏览器无法访问本地或

  • 问题内容: 众所周知,Windows使用带反斜杠的路径,而Unix使用带反斜杠的路径。node.js提供了始终使用正确的斜杠。因此,例如,您不必编写Unix,而只编写Unix 。 但是,似乎存在这种差异,但是如果您不对路径进行规范化(例如,使用path.join),而仅编写诸如node.js之类的路径,则在Windows上运行脚本没有问题。 那么,有没有写上任何好处了?无论平台如何,两者似乎都可以

  • 问题内容: 正在与一位同事讨论Javas库的设计。我提到我总是觉得很有趣,实际上在UI小部件上提供一个Observable接口的AWT / Swing类实际上称为“侦听器”。 随后,他通过指出与JDK 1.0 前后就存在的java.util.Observer和java.util.Observable发生名称冲突来打扰我。我以前从未听说过它们。 JavaDocs中没有列出用法,而google / g

  • 当我尝试执行我得到一个 我正试图找出问题所在,但我不知道是什么原因造成的。我正在使用MongoEngine(和MongoDB) 我的设置中有以下内容。py: 这就是我得到的: 回溯:get_response 111中的文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site packages/django/cor

  • 问题内容: 我目前正在用Java开发一个小平台,并为此编写了自己的游戏引擎,名为Bonsai。现在我问自己一个问题:“我是否过度使用了静态方法?”。 一方面,这非常方便,因为我不必在每个类(例如地图或玩家)中都引用游戏实例。另一方面,我已经不得不去除applet的支持了,因为那里所有静态的东西都非常小。 所以我的问题是,由于您可能比我更有经验的Java程序员,我应该摆脱所有的静态知识吗?如果是的话