什么是软可达对象?
What is a softly reachable object?
我正试图通过这篇 'Soft References in Java' 文章研究软引用的含义:
https://www.baeldung.com/java-soft-references
我理解这篇文章的问题是它通过术语"softly reachable object"定义术语"soft reference",但我不知道"softly reachable object"是什么意思。
也就是说,堆中的对象要么有对它的引用,要么没有,对吗?
引用要么指向有效对象,要么为空,对吗?
对象什么时候变得“软可达”?
还是我理解错了?
强引用、软引用和弱引用。
Student strongReference = new Student();
WeakReference<Student> weakReference = new WeakReference<>(strongReference);
同样
Student strongRef = new Student();
SoftReference<Student> softReference = new SoftReference<>(strongRef);
在垃圾回收期间,如果堆中的对象对其有强引用,那么它会存活下来,如果它没有强引用但有弱引用,那么它就不会存活。当对象被传递到生命周期管理器上下文之外时,它用于避免泄漏。
SoftReference 类似于 weakreference,但它们在垃圾收集周期中存活下来,直到内存充足。
如果没有强引用但有软引用,对象是软可达。由于只有弱引用的对象有资格进行垃圾回收,另一方面,只有软引用的对象更容易在垃圾回收中幸存下来(与弱引用相比)因此
没有强引用而只有软引用或弱引用的对象是软可达的
只有弱引用而没有强引用或软引用的对象是每周可达的
具有至少一个强引用的对象,无论是否有任何软引用或弱引用,都是强可达的。
以下两种情况堆中的对象是软可达的。
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()
时,检查是否为非空并仅用作本地变量。如果可能,仅将弱引用或软引用传递给其他方法。
WeakReference 和 SoftReference 之间的区别在各种 link 中得到了很好的解释,其中一个 link 是:
P.S。 WeakReference 和 SoftReference 类型对象的引用是强引用,它是弱或软可达的包装对象,以防没有强引用可用(可以使用 get()
检索对象)。
WeakReference <Student> weakRefOfStudent = new WeakReference<>(new Student());
weakRefOfStudent
是 WeakReference.java
类型的强引用,Heap 中 Student 类型的对象每周可达 。 weakRefOfStudent.get()
可以访问该对象。如果它是否被垃圾回收,它可能为 null 也可能不为 null。
这只是为了澄清可能出现的疑惑。
我认为链接的文章在第一句话中很好地解释了这一点。 软引用和软可达对象在那里是同义词。
因此,您问题的正确答案是 "A softly reachable object is an object which is only referenced by soft references"。
关于软引用的本质,这篇文章比我在此处的某些段落中解释得更好。
我正试图通过这篇 'Soft References in Java' 文章研究软引用的含义:
https://www.baeldung.com/java-soft-references
我理解这篇文章的问题是它通过术语"softly reachable object"定义术语"soft reference",但我不知道"softly reachable object"是什么意思。
也就是说,堆中的对象要么有对它的引用,要么没有,对吗?
引用要么指向有效对象,要么为空,对吗?
对象什么时候变得“软可达”?
还是我理解错了?
强引用、软引用和弱引用。
Student strongReference = new Student();
WeakReference<Student> weakReference = new WeakReference<>(strongReference);
同样
Student strongRef = new Student();
SoftReference<Student> softReference = new SoftReference<>(strongRef);
在垃圾回收期间,如果堆中的对象对其有强引用,那么它会存活下来,如果它没有强引用但有弱引用,那么它就不会存活。当对象被传递到生命周期管理器上下文之外时,它用于避免泄漏。
SoftReference 类似于 weakreference,但它们在垃圾收集周期中存活下来,直到内存充足。
如果没有强引用但有软引用,对象是软可达。由于只有弱引用的对象有资格进行垃圾回收,另一方面,只有软引用的对象更容易在垃圾回收中幸存下来(与弱引用相比)因此
没有强引用而只有软引用或弱引用的对象是软可达的
只有弱引用而没有强引用或软引用的对象是每周可达的
具有至少一个强引用的对象,无论是否有任何软引用或弱引用,都是强可达的。
以下两种情况堆中的对象是软可达的。
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()
时,检查是否为非空并仅用作本地变量。如果可能,仅将弱引用或软引用传递给其他方法。
WeakReference 和 SoftReference 之间的区别在各种 link 中得到了很好的解释,其中一个 link 是:
P.S。 WeakReference 和 SoftReference 类型对象的引用是强引用,它是弱或软可达的包装对象,以防没有强引用可用(可以使用 get()
检索对象)。
WeakReference <Student> weakRefOfStudent = new WeakReference<>(new Student());
weakRefOfStudent
是 WeakReference.java
类型的强引用,Heap 中 Student 类型的对象每周可达 。 weakRefOfStudent.get()
可以访问该对象。如果它是否被垃圾回收,它可能为 null 也可能不为 null。
这只是为了澄清可能出现的疑惑。
我认为链接的文章在第一句话中很好地解释了这一点。 软引用和软可达对象在那里是同义词。
因此,您问题的正确答案是 "A softly reachable object is an object which is only referenced by soft references"。
关于软引用的本质,这篇文章比我在此处的某些段落中解释得更好。