Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 您是否在任何项目中使用过PhantomReference?_Java_Reference - Fatal编程技术网

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

Java 您是否在任何项目中使用过PhantomReference?,java,reference,Java,Reference,关于幻影参考,我只知道 如果使用其get方法,它将始终返回null而不是对象。它有什么用? 通过使用PhantomReference,可以确保对象不能从finalize方法中恢复。 但是这个概念/类有什么用呢 你有没有在你的项目中使用过这个,或者你有没有任何我们应该使用这个的例子 A,来自Java词汇表 这当然与以下情况相吻合: 幻象引用对象,在收集器确定其引用对象可能被回收后排队。幻象引用最常用于以比Java终结机制更灵活的方式安排死前清理操作 最后但并非最不重要的是,所有血淋淋的细节这是一个

关于幻影参考,我只知道

如果使用其get方法,它将始终返回null而不是对象。它有什么用? 通过使用PhantomReference,可以确保对象不能从finalize方法中恢复。 但是这个概念/类有什么用呢

你有没有在你的项目中使用过这个,或者你有没有任何我们应该使用这个的例子

A,来自Java词汇表

这当然与以下情况相吻合:

幻象引用对象,在收集器确定其引用对象可能被回收后排队。幻象引用最常用于以比Java终结机制更灵活的方式安排死前清理操作

最后但并非最不重要的是,所有血淋淋的细节这是一个很好的阅读:

快乐编码。 但是为了回答这个问题,我只使用了weakreference。

A,来自Java词汇表

这当然与以下情况相吻合:

幻象引用对象,在收集器确定其引用对象可能被回收后排队。幻象引用最常用于以比Java终结机制更灵活的方式安排死前清理操作

最后但并非最不重要的是,所有血淋淋的细节这是一个很好的阅读:

快乐编码。 但是为了回答这个问题,我只使用了weakreference。

我在一个应用程序中使用了phantomreference来监视对象的创建和破坏。我需要他们跟踪破坏情况。但这种方法已经过时了。它是2004年针对J2SE1.4编写的。专业的评测工具功能更强大、更可靠,新的Java5特性(如JMX或代理和JVMTI)也可以用于此

总是与引用队列一起使用的PhantomReferences优于finalize,finalize有一些问题,因此应该避免。主要是使对象可以再次访问。这可以通过finalizerguardian习惯用法->阅读“effectivejava”中的更多内容来避免。所以他们也是新的定稿人

此外,幻影引用

允许您确定从内存中删除对象的确切时间。他们 事实上,这是唯一确定的方法。一般来说,情况并非如此 有用,但在某些非常特殊的情况下可能会派上用场 比如操纵大型图像:如果您确定图像应该 垃圾收集完毕后,您可以等到垃圾实际收集完毕后再尝试 加载下一个图像,从而减少可怕的OutOfMemoryError 可能的引自

如前所述,Roedy Green有一个。

我在a中使用PhantomReferences来监视对象的创建和销毁。我需要他们跟踪破坏情况。但这种方法已经过时了。它是2004年针对J2SE1.4编写的。专业的评测工具功能更强大、更可靠,新的Java5特性(如JMX或代理和JVMTI)也可以用于此

总是与引用队列一起使用的PhantomReferences优于finalize,finalize有一些问题,因此应该避免。主要是使对象可以再次访问。这可以通过finalizerguardian习惯用法->阅读“effectivejava”中的更多内容来避免。所以他们也是新的定稿人

此外,幻影引用

允许您确定从内存中删除对象的确切时间。他们 事实上,这是唯一确定的方法。一般来说,情况并非如此 有用,但在某些非常特殊的情况下可能会派上用场 比如操纵大型图像:如果您确定图像应该 垃圾收集完毕后,您可以等到垃圾实际收集完毕后再尝试 加载下一个图像,从而减少可怕的OutOfMemoryError 可能的引自

如前所述,Roedy Green有一个。

在PhantomReference更合适的地方使用WeakReference是很常见的。这避免了在垃圾回收器清除/排队WeakReference后能够恢复对象的某些问题。通常情况下,两者之间的区别并不重要,因为人们不是在玩傻蛋

使用PhantomReference往往更具侵入性,因为您不能假装get方法有效。例如,您不能编写Phantom[Identity]哈希映射。

在PhantomReference更合适的地方,通常使用WeakReference。这避免了在垃圾回收器清除/排队WeakReference后能够恢复对象的某些问题。通常情况下,两者之间的区别并不重要,因为人们不是在玩傻蛋


使用PhantomReference往往更具侵入性,因为您不能假装get方法有效。例如,您不能编写幻影[Identity]哈希映射 例如,PhantomReference是commons io项目中的org.apache.commons.io.FileCleaningTracker。FileCleaningTracker将在垃圾收集其标记对象时删除物理文件。
需要注意的是Tracker类,它扩展了PhantomReference类。

我在commons io项目中发现了PhantomReference的一个实用且有用的用例,即org.apache.commons.io.FileCleaningTracker。FileCleaningTracker将在垃圾收集其标记对象时删除物理文件。
需要注意的是Tracker类,它扩展了PhantomReference类。

我在单元测试中使用了PhantomReference来验证测试中的代码没有保留对某个对象的不必要的引用


我在单元测试中使用了PhantomReference来验证测试中的代码没有保留对某个对象的不必要的引用

幻影参考用法的定义:

幻影引用是知道对象已删除的安全方法 从记忆中。例如,考虑一个处理的应用程序。 大型图像。假设我们想在内存中加载一个大图像 当大映像已经在内存中,准备进行垃圾处理时 收集。在这种情况下,我们希望等到旧图像被删除 在加载新的前收集。这里,幻影参考是 灵活安全的选择。旧形象的参照 一旦旧图像对象被删除,将在引用队列中排队 最后定稿。在收到该引用后,我们可以加载新图像 在记忆中

幻影参考用法的定义:

幻影引用是知道对象已删除的安全方法 从记忆中。例如,考虑一个处理的应用程序。 大型图像。假设我们想在内存中加载一个大图像 当大映像已经在内存中,准备进行垃圾处理时 收集。在这种情况下,我们希望等到旧图像被删除 在加载新的前收集。这里,幻影参考是 灵活安全的选择。旧形象的参照 一旦旧图像对象被删除,将在引用队列中排队 最后定稿。在收到该引用后,我们可以加载新图像 在记忆中

这在Java9中应该已经过时了! 改用java.util.Cleaner!或旧版JRE上的sun.misc.Cleaner

原职:

我发现使用PhantomReferences与finalizer方法有着几乎相同数量的陷阱,但一旦正确使用,问题就会少一些。 我已经为Java8编写了一个小型解决方案,一个非常小的框架来使用PhantomReferences。 它允许使用lambda表达式作为回调,以便在删除对象后运行。您可以注册应该关闭的内部资源的回调。 有了这个,我找到了一个适合我的解决方案,因为它使它更加实用

下面是一个小示例,演示如何注册回调:

  class Foo implements Cleanup {
    //...  
    public Foo() { 
    //...    
      this.registerCleanup((value) -> {
        try {
          // 'value' is 'this.resource'
          value.close();
        } catch (Exception e) {
          logger.warning("closing resource failed", e);
        }
      }, this.resource);
    }
还有一种更简单的自动关闭方法,其操作与上述方法大致相同:

this.registerAutoClose(this.resource);
回答您的问题:

[那它有什么用]

你不能清理不存在的东西。但它本可以拥有仍然存在的资源,需要清理,以便将其移除

但是这个概念/类有什么用呢

除了调试/记录之外,不一定要做任何有效果的事情。或者是统计数据。 我认为它更像是来自GC的通知服务。 您还可以使用它来删除对象删除后变得无关的聚合数据,但可能有更好的解决方案。 示例经常提到要关闭数据库连接,但我不认为这是一个好主意,因为您无法处理事务。应用程序框架将为此提供更好的解决方案

你有没有在你的项目中使用过这个,或者你有没有任何我们应该使用这个的例子?或者这个概念仅仅是为了采访的观点

我使用它主要是为了记录日志。因此,我可以跟踪删除的元素,看看GC是如何工作的,并且可以进行调整。我不会以这种方式运行任何关键代码。如果需要关闭某些内容,那么应该在try with resource语句中完成。 我在单元测试中使用它,以确保没有任何内存泄漏。就像jontejj那样。但是我的解决方案更通用一些。

这应该在Java9中过时了! 改用java.util.Cleaner!或旧版JRE上的sun.misc.Cleaner

原职:

我发现使用PhantomReferences与finalizer方法有着几乎相同数量的陷阱,但一旦正确使用,问题就会少一些。 我已经为Java8编写了一个小型解决方案,一个非常小的框架来使用PhantomReferences。 它允许使用lambda表达式作为回调,以便在删除对象后运行。您可以注册应该关闭的内部资源的回调。 Wi 我已经找到了一个适合我的解决方案,因为它使它更加实用

下面是一个小示例,演示如何注册回调:

  class Foo implements Cleanup {
    //...  
    public Foo() { 
    //...    
      this.registerCleanup((value) -> {
        try {
          // 'value' is 'this.resource'
          value.close();
        } catch (Exception e) {
          logger.warning("closing resource failed", e);
        }
      }, this.resource);
    }
还有一种更简单的自动关闭方法,其操作与上述方法大致相同:

this.registerAutoClose(this.resource);
回答您的问题:

[那它有什么用]

你不能清理不存在的东西。但它本可以拥有仍然存在的资源,需要清理,以便将其移除

但是这个概念/类有什么用呢

除了调试/记录之外,不一定要做任何有效果的事情。或者是统计数据。 我认为它更像是来自GC的通知服务。 您还可以使用它来删除对象删除后变得无关的聚合数据,但可能有更好的解决方案。 示例经常提到要关闭数据库连接,但我不认为这是一个好主意,因为您无法处理事务。应用程序框架将为此提供更好的解决方案

你有没有在你的项目中使用过这个,或者你有没有任何我们应该使用这个的例子?或者这个概念仅仅是为了采访的观点

我使用它主要是为了记录日志。因此,我可以跟踪删除的元素,看看GC是如何工作的,并且可以进行调整。我不会以这种方式运行任何关键代码。如果需要关闭某些内容,那么应该在try with resource语句中完成。 我在单元测试中使用它,以确保没有任何内存泄漏。就像jontejj那样。但我的解决方案更一般

如果使用其get方法,它将始终返回null,而不是 对象[那它有什么用]

要调用而不是获取的有用方法是IseQueued或referenceQueue.remove。您可以调用这些方法来执行某些操作,这些操作需要在对象的最后一轮垃圾收集中执行

第一次是当对象调用finalize方法时,因此您也可以将结束钩子放在那里。然而,正如其他人所说的,可能有更可靠的方法来执行清理,或者在垃圾收集之前和之后,或者更一般地说,在对象生命周期结束时,需要执行的任何操作

如果使用其get方法,它将始终返回null,而不是 对象[那它有什么用]

要调用而不是获取的有用方法是IseQueued或referenceQueue.remove。您可以调用这些方法来执行某些操作,这些操作需要在对象的最后一轮垃圾收集中执行


第一次是当对象调用finalize方法时,因此您也可以将结束钩子放在那里。然而,正如其他人所说,在垃圾收集之前和之后,或者更一般地说,在对象的生命周期结束时,可能有更可靠的方法来执行清理或任何需要执行的操作。

我发现PhantomReferences在Jetty类中的另一个实际用途


Jetty使用LeakDetector类来检测客户机代码是否获取了资源,但从未释放过资源,LeakDetector类为此使用了PhantomReferences。

我在Jetty类中发现了PhantomReferences的另一个实际用途

Jetty使用LeakDetector类来检测客户机代码是否获取了资源,但从未释放过资源,LeakDetector类为此使用PhantomReferences。

在这种情况下,对于向量编辑器中的一些Swing代码,可以很容易地在绘制循环中创建成千上万的仿射转换实例,当它们很容易被回收和重用时,这就成为了分析的一个重要瓶颈。在逐行处理日志文件时,我使用了相同的模式重用CharBuffer实例。基本上,这种模式是:您有一些创建成本很高的数据结构,您可以完全重置其状态,而不是每次都创建一个新的数据结构。因此,您创建了一个PhantomReference子类,该子类强烈引用要回收和重用的对象,其referent可以引用该对象;要跟踪回收对象的安全时间,您可以

返回对象的facade,该facade实现相同的接口或足够接近的对象,例如包装CharBuffer的CharSequence实现,并将其用作PhantomReference或 调用者向您传递对其自身的引用,因此当调用者超出范围时,您可以回收对象 换句话说,这里的模式是你要求队列告诉你什么时候可以知道某个缓存内容的每个对象都消失了,这样你就可以将它重新提供给另一个调用者。

这里有一个:在这种情况下,对于向量编辑器中的一些Swing代码,当t 它们很容易回收和重用,这本身就是评测中的一个重要瓶颈。在逐行处理日志文件时,我使用了相同的模式重用CharBuffer实例。基本上,这种模式是:您有一些创建成本很高的数据结构,您可以完全重置其状态,而不是每次都创建一个新的数据结构。因此,您创建了一个PhantomReference子类,该子类强烈引用要回收和重用的对象,其referent可以引用该对象;要跟踪回收对象的安全时间,您可以

返回对象的facade,该facade实现相同的接口或足够接近的对象,例如包装CharBuffer的CharSequence实现,并将其用作PhantomReference或 调用者向您传递对其自身的引用,因此当调用者超出范围时,您可以回收对象
换句话说,这里的模式要求队列告诉您何时可以知道某个缓存内容的每个对象都消失了,这样您就可以将其重新提供给另一个调用者。

IdentityHashMap实际上是IdentityHashMap的适当位置之一。请注意,强引用保留了PhantomReference,而不是referent。您的实际意思是,对于弱引用,finalize可能会重新创建obj吗?weakref.get可能会返回null,然后,它仍然能够返回obj?@Pacerier finalize不会重新创建对象。在WeakReference从get返回null并排队后,它可以使对象再次强可访问user166390:正如WeakHashMap在引用目标上键入的映射中所做的那样,不是一个很好的引用标识映射。IdentityHashMap实际上是IdentityHashMap的适当位置之一。请注意,强引用保留了PhantomReference,而不是referent。您的实际意思是,对于弱引用,finalize可能会重新创建obj吗?weakref.get可能会返回null,然后,它仍然能够返回obj?@Pacerier finalize不会重新创建对象。在WeakReference从get返回null并排队后,它可以使对象再次强可访问user166390:正如WeakHashMap在引用目标上键入的映射一样,不是一个引用的身份映射,这很好。顺便说一句,关于那篇文章的问题。在关于PhantomReference的部分中,他通过这两个表保留了对连接对象的强引用。这意味着,假设池实例本身永远不会变得不可访问,则连接永远不会变得不可访问。所以相应的幻影引用永远不会排队,对吗?还是我遗漏了什么?哇,来自kdgregory的那篇文章值得一个+10 BTW,一个关于那篇文章的问题。在关于PhantomReference的部分中,他通过这两个表保留了对连接对象的强引用。这意味着,假设池实例本身永远不会变得不可访问,则连接永远不会变得不可访问。所以相应的幻影引用永远不会排队,对吗?或者我遗漏了什么?哇,kdgregory的那篇文章应该得到+10分。同样,你不能得到幻影参考的参考对象,这完全是用词不当:它应该被称为伪参考或非参考。下面是另一个代码线程:同样,你也不能得到幻影参考的参考对象,这完全是用词不当:它应该被称为fakerreference或NonReference。这两个都是抽象的,所以您不需要直接处理它们。两者都是抽象的,所以您不需要直接处理它们。