什么是软可达对象?

Ver*_*ive 2 java garbage-collection soft-references

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

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

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

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

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

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

还是我弄错了?

nit*_*.kk 5

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

Student strongReference = new Student(); 

WeakReference<Student> weakReference = new WeakReference<>(strongReference);
Run Code Online (Sandbox Code Playgroud)

相似地

Student strongRef = new Student();
SoftReference<Student> softReference = new SoftReference<>(strongRef);
Run Code Online (Sandbox Code Playgroud)

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

SoftReference 就像弱引用一样,但它们在垃圾收集周期中存活下来,直到有足够的内存可用。

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

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

  2. 只有 WeakReference 而没有强或软引用的对象是 Weekly Reachable

  3. 一个对象至少有一个强引用,有或没有任何软或弱引用是强可达的。

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

Student stRef = new Student();
SoftReference <Student> sfRef = new SoftReference<>(stRef);
stRef = null;
Run Code Online (Sandbox Code Playgroud)

或者

SoftReference <Student> sfRef = new SoftReference<>(new Student());
Run Code Online (Sandbox Code Playgroud)

使用对象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
 }
Run Code Online (Sandbox Code Playgroud)

因此,避免将从get()Weak 或 Soft 引用的方法返回的非空对象分配给静态或实例变量,否则它只会破坏其中任何一个的用法。如果需要以弱引用或软引用的形式使用这些中的任何一个,那么最好的方法是存储静态或实例变量。当您需要使用get()检查 not null 并仅用作本地变量时。如果可能,只传递给其他方法的弱引用或软引用。

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

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

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

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