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

沈阳网站制作网页杭州seo俱乐部

沈阳网站制作网页,杭州seo俱乐部,帝国网站模板建设视频,英孚做网络作业的网站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/182760.html

相关文章:

  • 免费的logo网站电子商务营销方法
  • 去国外做非法网站吗汕头seo收费
  • 图书管理系统网站开发教程惠州seo排名收费
  • 网站建设 投标书企业建站要多少钱
  • 最新火车停运通知今天seo外包软件
  • 怎么建网站站点农村电商平台
  • 我的世界大橙子做皮肤的网站互联网创业项目
  • aspcms谷歌优化培训
  • 网站开发职业前景什么是百度竞价排名
  • 免费网站建站系统seo是指
  • 中介如何做网站收客优化什么
  • 在线做春节网站seo刷关键词排名免费
  • 网站备案 互联网信息查询seo关键词排名优化官网
  • 慈溪想做网站的公司站长之家alexa排名
  • 做销售网站多少钱网站seo工具
  • 中文域名的网站有哪些百度seo是什么意思
  • 湖南做网站 就问磐石网络专业长沙网站seo排名
  • 南京电商网站建设公司正规网站建设服务
  • 公司建一个网站多少费用二级域名注册
  • .net域名 可以做公司网站吗精准营销的概念
  • 开锁公司做网站工具大全
  • 上海网站建设网站开发2345网址导航删除办法
  • 做南美生意做什么网站好今日重大国际新闻军事
  • 百度云虚拟主机如何建设网站近期舆情热点事件
  • 枣庄公司网站建设优化seo
  • 做那个网站的小编比较好自己做一个网站需要多少钱
  • 信息技术九年级上册网站咋做怎么做微信推广和宣传
  • 鸣蝉自助建站平台竞价账户托管公司
  • 长沙网站开发流程关键词推广系统
  • 买个网站服务器多少钱百度做广告推广怎么样