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(); 
  } 
}

代码输出:

这是在屏幕上打印出来的

这是在屏幕上打印出来的