Java对象引用级别

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

为了使程序能更灵活地控制对象生命周期从 JDK1.2 版本开始JDK把对象的引用级别由高到低分为强引用、软引用、弱引用、虚引用四种级别。
在这里插入图片描述

  1. 强引用 StrongReference

强引用是我们最常见的对象它属于不可回收资源垃圾回收器后面简称G C绝对不会回收它即使是内存不足J V M宁愿抛出 OutOfMemoryErrorM 异常使程序终止也不会来回收强引用对象。

User user = new User();
  1. 软引用 SoftReference
  • 如果对象是软引用那它的性质属于可有可无因为内存空间充足的情况下G C不会回收它但是内存空间紧张G C发现它仅有软引用就会回收该对象所以软引用对象适合作为内存敏感的缓存对象。
  • 只有对象仅被 SoftReference 引用它才是软引用级别对象因为对象可以在多处被引用所以 SoftReference 引用的对象它可能在其他处被强引用了。
User user = new User();
SoftReference<User> softReference = new SoftReference<>(user);
  1. 弱引用 WeakReference
  • 弱引用对象相对软引用对象具有更短暂的生命周期只要 G C 发现它仅有弱引用不管内存空间是否充足都会回收它不过 G C 是一个优先级很低的线程因此不一定会很快发现那些仅有弱引用的对象。
  • 只有对象仅被 WeakReference 引用它才是弱引用级别对象因为对象可以在多处被引用所以 WeakReference 引用的对象它可能在其他处被强引用了。
User user = new User();
WeakReference<User> weakReference = new WeakReference<>(user);
  1. 虚引用 PhantomReference
  • 顾名思义虚引用形同虚设与其他几种引用不同虚引用不会决定对象的生命周期。如果一个对象仅有虚引用那它就和没有任何引用一样任何时候都可能被 G C 回收.
  • PhantomReference使用get方法永远返回null简单说就是「无法通过虚引用来获取对象的真实地址。
User user = new User();
PhantomReference<User> phantomReference = new PhantomReference<>(user);
  1. 小结
  • 虚引用图中出现了ReferenceQueue引用队列引用队列是配合对象引用级别包装类SoftReference、WeakReference、PhantomReference使用当对象引用级别包装类所指向的对象被垃圾回收后该对象引用级别包装类被追加到引用队列因此可以通过引用队列做 G C 相关统计或额外数据清理等操作。
    在这里插入图片描述
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java