Java中的弱引用
时间:2020-02-23 14:34:43 来源:igfitidea点击:
本文讨论了Java中弱引用的概念。
在开始之前,让我们先了解一些基本知识。
Java中有4种类型的引用:
强引用
弱引用
软引用
虚拟引用
这里我们将讨论弱参照。
弱引用与Java中的垃圾回收有关。垃圾回收只是从内存中自动取消未引用对象的分配。
弱引用是指引用的强度不足以使对象保留在内存中。因此,弱引用可以让垃圾回收器决定对象的可访问性,以及该对象是否应该保存在内存中。
弱引用需要显式声明,因为默认情况下Java将引用标记为强引用。
什么是弱可达性?
这意味着一个对象既没有指向它的强引用也没有指向它的软引用,只能通过遍历弱引用来访问它。
因此,如果对象被弱引用,则垃圾回收器会将其从内存中移除,从而清理出更多的空间并进行更好的内存管理。
垃圾回收器移除弱引用后,将该引用放入引用队列中,并最终确定以前的弱可访问对象。
其中使用弱引用?
弱引用主要用于 规范化映射的实现。标准化映射是指映射只包含一个特定值的实例。
弱引用在WeakHashMap类中也被广泛使用。这是Map接口的实现,其中每个键值都存储为弱引用。键值对扩展WeakReference类。因此,垃圾回收器删除这个键会导致实体也被删除。
代码示例:
Private static class TryingOut<K,V> extends WeakReference <Object> implements Map.Entry <K,V>
失效侦听器问题也使用弱引用。在这种情况下,内存泄漏问题由弱引用处理。
实现弱引用:
java.lang.ref.WeakReference类在处理和创建弱引用时使用。
可以使用弱引用的实际场景是在建立数据库连接时,当使用该数据库的应用程序关闭时,垃圾回收器可能会清理该连接。
Java中弱引用的编码示例如下所示:
//Illustrating Weak references in Java import java.lang.ref.WeakReference; class WeakestRef { //coding starts from here public void something() { System.out.println("This is printed out on the screen"); } } public class TryingOutWeak { public static void main(String[] args) { //Strong Reference WeakestRef obj1 = new WeakestRef (); obj1.something(); //Creating Weak Reference to WeakestRef -type object to which 'obj1' is also pointing. WeakReference< WeakestRef > weakref = new WeakReference< WeakestRef >(obj1); //Now, WeakestRef -type object to which 'obj1' was pointing earlier is not available for garbage //collection. But will be only be garbage collected when JVM needs memory. Obj1 = null; //Note: You can also retrieve back the object which has been weakly referenced. It succesfully //calls the method. Obj1 = weakref.get(); Obj1.something(); } }
代码输出:
这是在屏幕上打印出来的
这是在屏幕上打印出来的