当前位置: 首页 > 知识库问答 >
问题:

当referent不再有效时,Java WeakReference仍保持有效引用

寇景明
2023-03-14

我对这个节目感到困惑:

class Point {
    private final int x;
    private final int y;
}
public class App
{
    WeakReference<Point> newPoint() {
        Point referent = new Point();
        return new WeakReference<Point>(referent); // after return, stack parameter referent is invalid.
    }
    public static void main( String[] args ) {
        App a = new App();
        WeakReference<Point> wp = a.newPoint(); // wp is hold valid or invalid reference?
        System.out.println(wp.get()); // not null
    }
}

我知道,如果弱引用指向一个不再活动的对象,它的get()应该返回null。但在我的代码中,它似乎还活着。

我哪里出错了?

共有1个答案

秦彦君
2023-03-14

我知道,如果弱引用指向一个不再活动的对象,它的get()应该返回null。但在我的代码中,它似乎还活着。

你的理解是不精确的,尤其是当它依赖于活力的概念时<一般而言,代码>参考对象,尤其是弱参考对象,与我所认识的任何生命感都没有直接关系。相反,他们关心的是可达性。

java.lang.引用#get()的API文档(不被Weak引用覆盖)如下所示:

返回此引用对象的引用对象。如果此引用对象已被程序或垃圾收集器清除,则此方法返回null。

请注意,get()返回null的条件非常具体:引用对象已被清除。这是通过调用给定实例的clear()方法来实现的。正如文档所指出的,这可以由垃圾收集器或应用程序来完成。

参考子类之间的主要区别之一是垃圾收集器执行此类清除的条件。对于Weak参考s,API文档说:

假设垃圾收集器在某个时间点确定某个对象是弱可访问的。到那时,它将在原子上清除对该对象的所有弱引用[…]。

因此,在垃圾收集器确定给定对象(仅)弱可访问之前,它不会清除对该对象的弱引用。垃圾回收器可能在小程序的短暂运行期间根本没有运行,如果它确实运行了,那么在调用引用的get()方法之前,如果能够正确地对其进行计时,以观察到所讨论的是弱可访问的,这将是令人惊讶的。

您可以尝试通过调用系统来强制GC运行。gc()在适当的位置。我预计这样做将导致弱引用被清除。然而,这只是为了说明目的。一般来说,您应该在适当的时候依赖Java来执行GC,而不是强制它。

 类似资料:
  • 我有一个场景,我们在Tinymce中定义了有效和无效元素。以下是这两个值: “无效的_元素”是为了防止输入JavaScript。通过以上设置,Tinymce不会阻止JavaScript,但如果我删除“valid_元素”,它就会开始工作。 我不确定我是否删除了“valid\u元素”,Tinymce将允许所有内容,这就是为什么保留“valid\u元素”。 Tinymce版本:5.6.2 相关问题,但在

  • 问题内容: 我试图确保传递给go程序的URL有效。但是,我似乎无法解决。我以为我可以解决问题,但这似乎并没有完成。 操场 有沿线的任何filter_var我可以使用吗? 问题答案: 您可以检查您的URL是否具有“方案”,“主机”和/或“路径”。 如果检查返回的URL,则可以看到无效部分已插入不透明数据部分(从某种意义上讲是有效的)。 如果您解析一个URL并且没有Scheme,Host和Path,则

  • 本文向大家介绍有线等效保密(WEP),包括了有线等效保密(WEP)的使用技巧和注意事项,需要的朋友参考一下 有线等效保密(WEP)是无线网络或WiFi的安全标准。它是原始IEEE 802.11协议的一部分。随着无线网络通过无线电波传输数据,窃听无线数据传输比通过电缆连接的有线网络相对容易。WEP旨在在无线网络中提供与有线对等设备相同级别的安全性和机密性。 WEP的功能 WEP于1997年作为IEE

  • 问题内容: 我知道“参数化查询”是圣杯。 这不是主题。 有一篇旧文章,似乎是使用addslashes时与sql注入相关的所有讨论的参考。 这是链接:http : //shiflett.org/blog/2006/jan/addslashes-versus-mysql-real- escape-string 我的问题是:这个概念证明是否仍然正确?我尝试对其进行测试,但是addlashes似乎可以正常

  • 我使用一个向移动应用程序公开REST API的Web应用程序。我将Spring Boot版本从1.5.3.RELEASE升级到2.0.2.RELEASE,在修复了一些重大更改后,我面临着一个无法解决的问题。 我遵循了SpringBoot2.0迁移指南和SpringBootSecurity2.0,还研究了Springboot2.0M4中的安全性变化。 问题是应用使用 JWT 身份验证,并且有一个终结