Java·引用

85 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情


Java·引用

1. Java中引用的简介

Java虚拟机很好地摒弃了指针地概念,通过垃圾回收器回收无用的对象,从而不用程序员手动去释放内存。 而关于引用API的出现为了让程序员创建所需要声明周期的内存对象,

2. Java中引用的分类

  • 强引用

强引用对象的特点是永不回收,即使启动了垃圾回收器也不会回收这种引用的对象。

  • 弱引用

弱引用对象的特点是垃圾回收器运行时会对此引用对象进行回收。

  • 虚引用

虚引用对象的特点是无法确定此对象的存活时间。

  • 软引用

软引用对象的特点是当内存不足时会对此对象进行回收。

3. 案例

  1. 强引用
案例一:强引用对象不会被垃圾回收器回收,进而导致内存溢出
public class Demo1 {
  public static void main(String[] args) {
    List<StringBuffer> stringBufferList = new ArrayList<StringBuffer>();

    while(true){
      StringBuffer stringBuffer = new StringBuffer();

      for(int i = 0 ; i < 10000 ; i++){
        stringBuffer.append(i);
      }
      stringBufferList.add(stringBuffer);
    }
  }
}
  1. 弱引用
案例二:当垃圾回收器运行时,弱引用对象会被垃圾回收器回收
public class Demo2 {
  public static void main(String[] args) {
    WeakReference<String> weakReference = new WeakReference<String>(new String("2"));

    System.out.println(weakReference.get());
    System.gc(); // 此处只是向JVM发出垃圾回收的请求,并不保证每次都能执行
    System.out.println(weakReference.get());
  }
}
  1. 软引用
案例三:让内存不足时,软引用对象会被垃圾回收器回收,建议与案例一做对比
public class Demo3 {
  public static void main(String[] args) {
    SoftReference<List<StringBuffer>> listSoftReference = new SoftReference<List<StringBuffer>>(new ArrayList<StringBuffer>());

    while(true){
      StringBuffer stringBuffer = new StringBuffer();

      for(int i = 0 ; i < 10000 ; i++){
        stringBuffer.append(i);
      }
      listSoftReference.get().add(stringBuffer);
    }
  }
}

4.ReferenceQueue

ReferenceQueue此类的出现主要是为了解决各种引用的回收,即我们创建的对象小时候,对这些对象的强引用,弱引用等各类引用依然占据内存,所以此类的出现是在创建这些引用时,在某些时刻进行回收。