多线程学习笔记之 - 四种引用

1.四种引用类型

  • 强引用(Strong Reference)
  • 软引用(Soft Reference)
  • 弱引用(Weak Reference)
  • 虚引用(Phantom Reference)

2.区别

强引用(Strong Reference)

强引用是指在程序代码中普遍存在的,类似“Object obj=new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。
只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象

软引用(Soft Reference)

软引用是用来描述一些有用但并不是必需的对象。对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。
因为软引用的特点,一般用来做缓存(例:大图片在使用后,如果内存不够时,直接gc掉,腾出来可用空间)

import java.lang.ref.SoftReference;
public class Main {
 public static void main(String[] args) {
    SoftReference sr = new SoftReference(new String("hello"));
        System.out.println(sr.get());
 }
}

弱引用(WeakReference)

弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。弱引用一旦遇到GC就一定会被回收。
那弱引用有什么用呢?它有一个特点,就是弱引用指向的对象,如果有强引用存在,就不会被回收。当强引用消失时,弱引用自动被回收。实际的应用在ThreadLocal对象的ThreadLocalMap中,避免过多的内存泄漏导致内存溢出。

import java.lang.ref.WeakReference;
 
public class Main {
    public static void main(String[] args) {
     
        WeakReference sr = new WeakReference(new String("hello"));
         
        System.out.println(sr.get());
        System.gc();                //通知JVM的gc进行垃圾回收
        System.out.println(sr.get());
    }
}

虚引用(Phantom Reference)

虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
  
public class Main {
    public static void main(String[] args) {
        ReferenceQueue queue = new ReferenceQueue();
        PhantomReference pr = new PhantomReference(new String("hello"), queue);
        System.out.println(pr.get());
    }
}

虚引用必须和队列一起使用,一旦GC时发现对象存在虚引用,就会把它放进队列里。那虚引用有什么作用呢?
用于自动回收堆外内存。有一个DirectByteBuffer类,可以控制堆外内存,当GC回收它之前,会先将其使用的堆外内存回收。基本用不到,只是大概做个了解即可。

你可能感兴趣的:(多线程学习笔记之 - 四种引用)