Java 中的四种引用方式

Java 中的四种引用方式

1、强引用(Strong Reference)
  • 强引用是最普遍的引用
  • 当一个对象是强引用,垃圾回收器绝不会回收他
  • 当内存不足时,JVM 宁愿抛出 OutOfMemoryError 错误,也不会回收具有强引用的对象,来解决内存不足问题
Object strongReference = new Object();
  • 如果强引用对象不使用时,需要 弱化从而使 GC 能够回收
(1)弱化方式1
  • 显示的设置 strongReference 对象为null,则 gc 认为该对象不存在引用,这时就可以回收这个对象

  • 如果 strongReference 是 全局变量,就需要在不用这个对象时赋值为null,因为强引用不会被垃圾回收。

strongReference = null;

应用场景:在ArrayList集合类中定义elementData数组,在调用clear()方法清空集合元素时,将每个数组元素被赋值为null。目的是为了将内存数组中存放的引用类型进行内存释放,可以及时释放内存。不选择将elementData=null,是为了避免在后续调用add()等方法添加新元素时,需要进行内存的重新分配

//ArrayList 源码
public void clear() {
    modCount++;

    // clear to let GC do its work
    for (int i = 0; i < size; i++)
        elementData[i] = null;

    size = 0;
}
(2)弱化方式2

让对象超出作用域范围,即缩小强引用的作用范围

public void test() {
    Object strongReference = new Object();
    // 省略其他操作
}

应用场景:在一个方法的内部有一个强引用,这个引用保存在VM Stack中(GC Root*),而真正的引用对象(Object)保存在中。当这个方法运行完成后,就会退出方法栈,则这个对象会被回收。

2、软引用(Soft Reference)
  • 如果一个对象只具有软引用,则 内存空间充足 时,垃圾回收器就不会回收它
  • 如果 内存空间不足时 ,就会回收这些对象,从而释放内存
  • 软引用可以用来实现内存敏感的高速缓存

使用 SoftReference 创建软引用

// 定义和访问软引用
// 强引用
String strongReference = new String("abc");

// 软引用
String str = new String("abc");
SoftReference<String> softReference = new SoftReference<String>(str);

// 访问软引用
softReference.get();
  • 软引用对象是在jvm内存不够的时候才会被回收,我们调用System.gc()方法只是起通知作用,最终何时回收,由JVM决定。
  • 所以,当内存不足时,JVM首先将软引用中的对象引用置为null,然后通知垃圾回收器进行回收:
//回收软引用
// 软引用
String str = new String("abc");
SoftReference<String> softReference = new SoftReference<>(str);

str = null;

// Notify GC
System.gc();

try {
    byte[] buff1 = new byte[900000000]; // 内存充沛
    // byte[] buff2 = new byte[900000000]; // 内存不足
} catch (Error e) {
    e.printStackTrace();
}

System.out.println(softReference.get()); // abc 或 null

**应用场景:**短视频APP中的视频缓存,后退时,显示的短视频内容是重新进行请求还是从缓存中取出呢?

  1. 如果一个短视频在播放结束时,就进行内容的回收,则后退查看前面播放的短视频时,需要重新请求。
  2. 如果将播放过的短视频存储到内存中,会造成内存的开销,甚至会造成内存溢出。

此时,可以使用软引用解决这个实际问题:

//软引用案例
// 获取视频播放器对象
Player videoAlayer = new Player();

// 加载短视频
Video video = audioAlayer.getVideo();

// 将播放完毕的短视频设置为软引用
SoftReference softReference = new SoftReference(video);

// 回退或者再次播放时
if(softReference.get() != null) {
    // 内存充足,还没有被回收器回收,直接获取缓存
    video = softReference.get();
} else {
    // 内存不足,软引用的对象已经回收
    video = audioAlayer.getVideo();
    // 重新构建软引用
    softReference = new SoftReference(video);
}
3、弱引用(Weak Reference)
  • 只具有 弱引用 的对象拥有 更短暂生命周期
  • 在垃圾回收器扫描的时候,不管内存是否足够,都会回收它的内存

创建弱引用,使用 WeakReference

String str = new String("abc");
WeakReference<String> weakReference = new WeakReference<>(str);
str = null;

System.gc();
		
// 一旦发生GC,弱引用一定会被回收
System.out.println(weakReference.get());
4、虚引用(Phantom Reference)
  • 虚引用是最弱的一种引用关系
  • 如果一个对象仅持有虚引用,完全不会对其生存时间构成影响,它就和没有任何引用一样,随时可能会被回收
  • 主要用来跟踪对象被垃圾回收的活动,可以在垃圾收集时收到一个系统通知
public class PhantomReference<T> extends Reference<T> {
    public T get() {
        return null;
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Java四种不同类型的引用: 1. 强引用(Strong Reference):通常使用的引用方式,使用强引用的对象在内存空间不足时不会被回收。 2. 软引用(Soft Reference):当内存空间不足时,对象可能会被回收,但是在回收之前它可以被缓存。 3. 弱引用(Weak Reference):当内存空间不足时,对象很快就会被回收。 4. 虚引用(Phantom Reference):它不能单独使用,必须和引用队列(ReferenceQueue)一起使用,当对象被回收时,JVM会把它加入到引用队列。 这四种引用的不同在于,它们对垃圾回收器的回收策略不同,因此它们对于内存管理的影响不同。 ### 回答2: Java 的四大引用分别是强引用、软引用、弱引用和虚引用。 1. 强引用Java最常见的引用类型。通过 `new` 关键字生成的对象默认都是强引用。强引用的对象不会被垃圾回收器回收,即使内存不足时也不会被回收。只有当强引用失去引用时,垃圾回收器才会将其回收。 2. 软引用Java的软引用是用来描述一些还有用但不是必需的对象。在内存不足时,垃圾回收器会选择性地回收软引用对象。这种引用常常用于缓存数据,当内存足够时,可以提供数据的快速访问,当内存不足时,可以被回收释放内存。 3. 弱引用Java的弱引用是比软引用更弱一些的引用类型。弱引用对象在垃圾回收时,只要被垃圾回收器发现,就会被回收。弱引用通常用于跟踪对象的状态,当对象被回收时,可以执行特定的操作。 4. 虚引用Java的虚引用是最弱的一种引用。虚引用主要用于对象回收跟踪。与弱引用不同的是,虚引用在任何时候都可能被垃圾回收器回收,甚至无法通过虚引用获取对象。虚引用一般与引用队列(Reference Queue)联合使用,用于监控对象被垃圾回收的状态。 引用的不同类型在内存管理起到不同的作用,能够提供更灵活的内存控制机制。程序员可以根据对象的生命周期和内存需求,选择合适的引用类型,从而更好地管理内存。 ### 回答3: Java 的四大引用是强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。 1. 强引用是默认的引用类型,也是最常用的引用类型。当对象被一个强引用引用时,对象将会一直存在,不会被垃圾回收器回收。 2. 软引用用来描述一些还有用但并非必须的对象。当内存不足时,垃圾回收器可能会回收软引用对象所占用的内存。可以通过SoftReference类来创建软引用。 3. 弱引用用来描述非必须的对象,它的生命周期比软引用更短。当垃圾回收器执行垃圾回收时,无论内存是否足够,都会回收弱引用对象。可以通过WeakReference类来创建弱引用。 4. 虚引用是最弱的引用类型,几乎没有实质性的作用。用来跟踪对象被垃圾回收器回收的活动。无法通过虚引用获得对象的实例,其主要作用是在对象被回收前收到一个系统通知。可以通过PhantomReference类来创建虚引用。 在Java,使用合适的引用类型可以更好地管理内存,避免内存溢出。强引用应该谨慎使用,避免产生内存泄漏。而软引用和弱引用则可以用来优化缓存机制,当内存紧张时自动释放缓存。虚引用则主要用于追踪对象的回收情况。理解并正确使用这四大引用可以提高代码的性能和健壮性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kⅈꫛᧁ269

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值