Skip to main content

引用类型

David LiuAbout 3 min

引用类型

强引用

普通变量赋值即为强引用,如

A a = new A();

回收特点

当内存空间不足,Java 虚拟机宁愿抛出 OutOfMemoryError 错误,使程序异常终止,也不会靠回收具有强引用的对象,来解决内存不足的问题。通过 GC Root 的引用链,如果强引用不到该对象,该对象才能被回收。

如果想中断或者回收强引用对象可以显式地将引用赋值为 null(a=null),这样的话 JVM 就会在合适的时间,进行垃圾回收。

软引用

引用和对象通过SoftReference建立关联

SoftReference a = new SoftReference(new A());

回收特点

“内存不够就回收,内存充足不回收”

“适合做缓存”

2、当系统内存够用就保留不回收(及时发生了 GC),内存不足时,会被回收

3、软引用自身不会被垃圾回收,因为 GC Root 还引用着,软引用自身需要配合引用队列来释放。

软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java 虚拟机就会把这个软引用加入到与之关联的引用队列中。

4、软引用适合缓存使用的场景,当内存不够的时候,对象是被回收的。

应用案例

缓存:

弱引用

WeakReference a = new WeakReference(new A());

回收特点

“只要发生 GC,一定被回收”

2、如果仅有弱引用引用该对象时,只要发生垃圾回收,就会释放该对象

3、当一个对象仅仅被 weak reference 指向, 而没有任何其他 strong reference 指向的时候, 如果 GC 运行, 那么这个对象就会被回收。如果存在强引用同时与之关联,则进行垃圾回收时也不会回收该对象。

4、ThreadLocal 和 WeakHashMap 内部都是使用了弱引用,用来保证那些不被用到的 key 值,在垃圾回收的时候可以被回收掉。

应用案例

ThreadLocal

虚引用

PhantomReference a = new PhantomReference(new A(), referenceQueue);

  1. 也称为幽灵引用或者幻影引用,它是最弱的引用关系。无法通过虚引用来取得一个对象实例。
  2. 为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。PhantomReference 类来实现虚引用。
  3. 必须配合引用队列一起使用,当虚引用所引用的对象被回收时(a 对象、b 对象),由 Reference Handler 线程将虚引用对象入队,这样就可以知道哪些对象被回收,从而对它们关联的资源做进一步处理

总结

1、对于强引用,平时在编写代码时会经常使用。

2、而其他三种类型的引用,使用得最多就是软引用和弱引用,这两种既有相似之处又有区别,他们都来描述非必须对象。

3、被软引用关联的对象只有在内存不足时才会被回收,而被弱引用关联的对象在 JVM 进行垃圾回收时总会被回收。

4、Java 中 4 种引用的级别由高到低依次为:强引用 > 软引用 > 弱引用 > 虚引用

docker run -d -p 8848:8848 -e MODE=standalone -e PREFER_HOST_MODE=hostname -v /appdata/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties -v /appdata/nacos/logs:/home/nacos/logs --restart always --name nacos nacos/nacos-server