当前位置: 首页 > wzjs >正文

银川建立网站网站建设解决方案服务商

银川建立网站,网站建设解决方案服务商,网站建设 400电话 广告语,跨境电商的发展现状Java中的四大引用类型详解:强引用、软引用、弱引用、虚引用 1. 引用类型概览 Java提供了四种不同强度的引用类型,用于控制对象的生命周期和垃圾回收行为: 引用类型回收时机典型应用场景是否影响GC强引用永不回收(除非断开引用&…

Java中的四大引用类型详解:强引用、软引用、弱引用、虚引用

1. 引用类型概览

Java提供了四种不同强度的引用类型,用于控制对象的生命周期和垃圾回收行为:

引用类型回收时机典型应用场景是否影响GC
强引用永不回收(除非断开引用)普通对象创建不回收
软引用内存不足时回收缓存实现可能回收
弱引用下次GC必定回收临时缓存/监听器必定回收
虚引用随时可能回收(跟踪回收状态)对象回收跟踪特殊用途

2. 强引用(Strong Reference)

特点

  • 默认引用类型Object obj = new Object()就是强引用
  • 回收条件:只有当没有任何强引用指向对象时才会被回收

代码示例

// 强引用示例
String strongRef = new String("Strong Reference");// 断开强引用(此时对象可被GC回收)
strongRef = null; 

内存泄漏场景

List<Object> leakList = new ArrayList<>();
while(true) {leakList.add(new Object()); // 不断添加对象且不释放
}
// 即使不再使用,由于List持有强引用,对象无法被回收

3. 软引用(Soft Reference)

特点

  • 内存敏感缓存:当内存不足时才会被回收
  • 比弱引用"强":JVM会尽量保留软引用对象

代码示例

// 创建软引用
SoftReference<byte[]> softRef = new SoftReference<>(new byte[1024 * 1024]); // 1MB// 获取引用对象(可能返回null)
byte[] data = softRef.get(); 
if(data == null) {// 对象已被回收,需要重新创建data = new byte[1024 * 1024];softRef = new SoftReference<>(data);
}

典型应用

  • 图片缓存(Android的LruCache内部使用)
  • 计算结果缓存(当内存紧张时自动释放)

4. 弱引用(Weak Reference)

特点

  • 短期缓存:只要发生GC就会被回收
  • 不会阻止回收:比软引用更脆弱

代码示例

// 创建弱引用
WeakReference<Object> weakRef = new WeakReference<>(new Object());// 手动触发GC(仅用于演示)
System.gc();// 大概率返回null
System.out.println(weakRef.get()); 

典型应用

// 1. WeakHashMap键的自动清理
WeakHashMap<Object, String> map = new WeakHashMap<>();
map.put(new Object(), "value"); // 键对象无其他强引用时会被自动移除// 2. 监听器防内存泄漏
public class MyListener {void register() {someService.register(new WeakReference<>(this));}
}

5. 虚引用(Phantom Reference)

特点

  • 最弱引用:无法通过get()获取对象
  • 回收跟踪:用于监控对象被回收的时机

代码示例

// 创建引用队列
ReferenceQueue<Object> queue = new ReferenceQueue<>();// 创建虚引用(必须关联队列)
PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), queue);// 永远返回null(与其他引用不同)
System.out.println(phantomRef.get()); // null// 监控回收(通常另启线程检查队列)
new Thread(() -> {try {Reference<?> ref = queue.remove();System.out.println("对象被回收了:" + ref);} catch (InterruptedException e) {Thread.currentThread().interrupt();}
}).start();

典型应用

  • NIO的DirectByteBuffer清理(通过Cleaner机制)
  • 资源精确释放(如知道某大对象何时被回收后执行清理)

6. 引用队列(ReferenceQueue)

所有引用类型都可以关联引用队列,用于跟踪引用对象的状态变化:


ReferenceQueue<Object> queue = new ReferenceQueue<>();// 创建带队列的弱引用
WeakReference<Object> ref = new WeakReference<>(new Object(), queue);System.gc();// 检查队列(非阻塞)
Reference<?> polledRef = queue.poll();
if(polledRef != null) {System.out.println("对象已被回收");
}

7. 四种引用的GC行为对比

引用类型get()行为是否入队列典型GC时机
强引用返回对象不适用永不回收
软引用可能返回null内存不足时入队内存不足时
弱引用可能返回nullGC后入队下次GC
虚引用永远返回nullGC后入队不确定(最优先回收)

8. 实战建议

  1. 缓存选择

    • 需要长期缓存 → 软引用
    • 临时缓存 → 弱引用
  2. 内存泄漏排查

    // 检查弱引用是否异常存活
    WeakReference<Object> ref = new WeakReference<>(suspectObj);
    System.gc();
    if(ref.get() != null) {System.out.println("存在强引用持有!");
    }
    
http://www.dtcms.com/wzjs/601084.html

相关文章:

  • 网站建设财务上做什么费用石家庄做网站科技公司
  • 网站开发 入门教程青岛产品宣传片制作
  • 郓城县城乡和建设局网站昆明哪里做网站
  • html5 网站开发软件什么是网络营销4p策略
  • 加急网站备案网站建设学习浩森宇特
  • 东营 网站 建设seo免费课程
  • 北京建网站品牌公司国家建设信息公示平台
  • 聚名网站可以自己做直播网站吗
  • 医院网站建设方案为成长持续赋能
  • 南山网站设计训wordpress 自动剪裁
  • 网站建设和维护合同从建站到网络优化
  • 网站版式有哪几种wordpress哪些文件需要给777
  • 自己创免费网站专业的平面设计网站有哪些
  • p2p网站开发的流程拘束 wordpress
  • 自己做好网站守游网络游戏推广平台
  • 做网站必须买云虚拟主机吗极路由做网站
  • 天水网站制作公司广州网站改版方案
  • 遵义本地网站济南住房和城乡建设局网站
  • 浙江鼎兴建设有限公司网站公司部门章有法律效力吗
  • 服饰网站模板陕西交通建设集团蓝商分公司网站
  • 网站建设未来北京做兼职的网站
  • 中国纳溪门户网站建设项目环境影响长沙网络推广小公司
  • intitle 郑州网站建设网站哪个语言好
  • 出口家具东莞网站建设wordpress 获取js路径
  • 网站评论怎么做的投资网站php源码
  • 南博网站建设泰安手机网站建设
  • 如何做网站竞品分析网站怎么做可以合法让别人充钱
  • 做动画在线观看网站有什么做树状图的网站
  • 服务器做免费空间网站管理录像教程山东百度推广代理
  • 东莞外贸建站及推广1元涨1000粉