本文由Scarb发表于金甲虫的博客,转载请注明出处

Java 引用 强软弱虚

强引用

一般new对象创建的引用是强引用,只要引用存在就不会被垃圾回收。

软引用

SoftReference,当一个对象只有软引用指向时,只有系统内存不够用时会回收

应用

  • 缓存

弱引用

WeakReference,只要进行垃圾回收,就会被回收。

应用



  • 容器
  • WeakHashMap
  • ThreadLocal
    • Thread的ThreadLocalMap对象的key是TheadLocal对象,值是继承WeakReference<ThreadLocal<?>>Entry`类
    • 这里Entry的key通过一个弱引用指向ThreadLocal
    • 若是强引用,即使threadlocal = null,key的引用依然指向该threadlocal对象,会有内存泄漏;使用弱引用则不会
    • 但当threadlocal被回收,key的值变为null,导致value无法被访问到,此时依然存在内存泄漏
    • 所以使用ThreadLocal时,若不用某个对象,需要执行remove()方法:threadlocal.remove()

虚引用

PhantomReference(Object, ReferenceQueue)。
指向一个对象,并关联一个引用队列。
当虚引用被垃圾回收,会把该引用放入引用队列。

虚引用无法通过get()方法获取对象值,只是在对象被垃圾回收时发出一个通知(将对象放入引用队列)。

应用

  • 管理堆外内存(直接内存)