MST

星途 面试题库

面试题:Java中对象存活时间分析之引用类型影响

在Java中,强引用、软引用、弱引用和虚引用对对象存活时间有什么不同影响?请举例说明如何使用这些引用类型来控制对象的存活时间。
47.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

强引用

  • 对对象存活时间的影响:只要存在强引用指向对象,对象就不会被垃圾回收器回收,即使内存不足也不会回收该对象,可能导致内存溢出。
  • 示例
Object strongRef = new Object();
// strongRef 是强引用,只要 strongRef 存在,new Object() 就不会被回收

软引用

  • 对对象存活时间的影响:当内存足够时,软引用对象不会被回收;只有当内存不足时,垃圾回收器才会回收软引用指向的对象。常用于实现缓存。
  • 示例
SoftReference<Object> softRef = new SoftReference<>(new Object());
Object obj = softRef.get();
if (obj != null) {
    // 使用 obj
} else {
    // 内存不足,对象已被回收,可重新创建对象
    obj = new Object();
    softRef = new SoftReference<>(obj);
}

弱引用

  • 对对象存活时间的影响:只要垃圾回收器扫描到弱引用指向的对象,不管当前内存是否充足,都会回收该对象。
  • 示例
WeakReference<Object> weakRef = new WeakReference<>(new Object());
Object obj = weakRef.get();
if (obj != null) {
    // 使用 obj
} else {
    // 对象已被回收,可重新创建对象
    obj = new Object();
    weakRef = new WeakReference<>(obj);
}
// 当发生垃圾回收时,weakRef 指向的对象大概率会被回收

虚引用

  • 对对象存活时间的影响:虚引用对对象的生命周期没有任何影响,也无法通过虚引用来获取对象实例。主要用于对象被回收时收到系统通知。
  • 示例
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), referenceQueue);
// 无法通过 phantomRef 获取对象实例
// 当关联的对象被回收时,虚引用会被放入 ReferenceQueue 中
Reference<? extends Object> ref = referenceQueue.poll();
if (ref != null) {
    // 可在这里进行对象回收后的处理
}