什么是软可达物体?

2023-12-24

我试图通过这篇“Java 中的软引用”文章来研究软引用的含义:

https://www.baeldung.com/java-soft-references https://www.baeldung.com/java-soft-references

我理解这篇文章的问题是它通过术语“软可达对象”定义了术语“软引用”,但我不知道“软可达对象”是什么意思。

也就是说,堆中的对象要么有对其的引用,要么没有,对吗?

引用要么指向有效对象,要么为 null,对吗?

什么时候一个物体会变成“softly可达”?

还是我都搞错了?


强引用、软引用和弱引用。

Student strongReference = new Student(); 

WeakReference<Student> weakReference = new WeakReference<>(strongReference);

相似地

Student strongRef = new Student();
SoftReference<Student> softReference = new SoftReference<>(strongRef);

在垃圾回收期间,如果堆中的对象对它有强引用,那么它会存活下来,如果它没有强引用但有弱引用,那么它就不会存活。当对象传递到生命周期管理器上下文之外时,它用于避免泄漏。

软引用类似于弱引用,但它们会在垃圾回收周期中幸存下来,直到内存有足够的可用为止。

一个对象是轻轻触手可及如果没有强引用并且有软引用。由于仅具有弱引用的对象有资格进行垃圾收集,而另一方面仅具有软引用的对象更容易在垃圾收集中生存(与弱引用相比),因此

  1. 没有强引用而只有软引用或弱引用的对象是软可达的

  2. 仅具有 WeakReference 而没有强引用或软引用的对象是每周可访问的

  3. 具有至少一个强引用(带或不带任何软引用或弱引用)的对象是强可达的。

以下两种情况堆中的对象都是软可达的。

Student stRef = new Student();
SoftReference <Student> sfRef = new SoftReference<>(stRef);
stRef = null;

Or

SoftReference <Student> sfRef = new SoftReference<>(new Student());

使用对象get()方法已被使用,但我们知道它为您提供了强有力的参考。

假设你有

Student strongReference = new Student(); 

SoftReference<Student> softReference = new SoftReference<>(strongReference);
 strongReference = null; // object in heap is softly reachable now
 Student anotherStrongReference = softReference.get();
 if(anotherStrongReference != null){
      // you have a strong reference again
 }

因此,避免分配从返回的非空对象get()对静态或实例变量的弱引用或软引用的方法,否则它只会破坏其中任何一个的用法。使用其中任何一个的最佳方法是如果需要以弱引用或软引用的形式存储静态或实例变量。当你需要使用时get()检查不为空并仅用作局部变量。如果可能的话,仅传递给其他方法弱引用或软引用。

WeakReference 和 SoftReference 之间的区别在各个链接中都有很好的解释,其中一个链接是:https://stackoverflow.com/a/299702/504133 https://stackoverflow.com/a/299702/504133

附: WeakReference 和 SoftReference 对象类型的引用是强引用的,它是弱或软可达的包装对象,以防没有可用的强引用(可以通过使用检索该对象get()). WeakReference <Student> weakRefOfStudent = new WeakReference<>(new Student());

weakRefOfStudent是类型的强引用WeakReference.java堆中类型为 Student 的对象每周可访问。该对象可以通过以下方式访问weakRefOfStudent.get()。如果它已被垃圾收集,则它可能为空,也可能不为空。

这只是为了澄清可能出现的疑虑。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是软可达物体? 的相关文章

  • 序列的排列?

    我有具体数量的数字 现在我想以某种方式显示这个序列的所有可能的排列 例如 如果数字数量为3 我想显示 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • 将 MOXy 设置为 JAXB 提供程序,而在同一包中没有属性文件

    我正在尝试使用 MOXy 作为我的 JAXB 提供程序 以便将内容编组 解组到 XML JSON 中 我创建了 jaxb properties 文件 内容如下 javax xml bind context factory org eclip
  • 像 Java 这样的静态类型语言中动态方法解析背后的原因是什么

    我对 Java 中引用变量的动态 静态类型和动态方法解析的概念有点困惑 考虑 public class Types Override public boolean equals Object obj System out println i
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db

随机推荐