java - 什么是软可达对象?

标签 java garbage-collection soft-references

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

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

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

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

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

对象什么时候变得“可达”?

还是我弄错了?

最佳答案

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

Student strongReference = new Student(); 

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

同理

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

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

SoftReference 类似于 weakreference,但它们在垃圾回收周期中存活下来,直到内存充足为止。

如果没有强引用但有软引用,则对象软可达。由于只有弱引用的对象有资格进行垃圾回收,另一方面,只有软引用的对象更容易在垃圾回收中幸存下来(与弱引用相比)因此

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

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

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

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

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

或者

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()检查 not null 并仅用作本地变量。如果可能,仅将弱引用或软引用传递给其他方法。

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

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

weakRefOfStudentWeakReference.java 类型的强引用并且 Heap 中类型为 Student 的对象每周可达weakRefOfStudent.get() 可以访问该对象.如果它是否被垃圾回收,它可能为 null 也可能不为 null。

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

关于java - 什么是软可达对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51891168/

相关文章:

java - 如何在每个循环实例的新行中将数据写入Excel工作表而不替换以前的数据,即如何为每个循环实例追加行?

java - 使用监听器的奇怪 java 并发问题

java - 匿名监听器是否与弱引用不兼容?

python - 有什么方法可以使用 Numpy 数组创建软引用或类似指针的对象吗?

java - fragment 中的 CardView 不可见

java - 'extends Object' 有目的还是多余的?

java - 如何使用 yourkit 调查类加载器泄漏

Java gc - 什么是长生命周期对象?

java - 何时在 Java 中使用弱引用和虚引用

java - map 中软引用的用法?