JAVA引用类型

引用类型

强引用(Strong Reference)

  • 默认的引用类型
  • 只要强引用存在,对象就不会被垃圾回收
  • 即使内存不足时抛出OOM,也不会回收强引用对象

软引用(Soft Reference)

  • 内存充足时,不会被回收
  • 内存不足时,会被回收(在OOM之前)
  • 适合做缓存

弱引用(Weak Reference)

  • 无论内存是否充足,只要发生GC就会被回收
  • 比软引用生命周期更短

虚引用(Phantom Reference)

  • 最弱的引用
  • 无法通过虚引用获取对象(get()始终返回null)
  • 必须与ReferenceQueue一起使用
  • 对象被回收时,会收到通知
  • 使用完必须调用clear()

注意:

  1. 虚引用的get()永远返回null - 这是设计上的特性
  2. 必须与ReferenceQueue配合使用 - 否则虚引用没有意义,因为get() 永远返回null。所有的引用都可以结合ReferenceQueue使用,只有虚引用必须配合ReferenceQueue使用,当从ReferenceQueue中拿到虚引用对象时,说明对象将被清理
  3. 虚引用必须调用clear() - 否则对象无法被完全回收。软引用和弱引用在GC时会自动调用clear(),所以程序员不需要显式调用,虚引用在GC时不会自动clear(),必须手动调用以完成对象回收(其实就是将引用置为null,解除和被引用对象的关系,使其可以被回收)
  4. 通知时机 - 对象进入finalization阶段,但还未从内存清除

软/弱引用:自动化内存管理

虚引用:精确控制资源释放时机

虚引用的特殊设计(get()返回null,必须手动clear())是为了:

  • 防止误用(不应该通过虚引用获取对象)
  • 确保资源在正确时机清理
  • 提供对象回收的精确通知机制

对比

相关推荐
看浪的路人7 分钟前
第9讲:大模型应用监控与可观测性——OpenTelemetry + Prometheus + Grafana 全链路追踪
java·前端·spring
临床数据科学和人工智能兴趣组19 分钟前
在R语言的生态系统中,字符串处理一直是一个重要且复杂的任务
开发语言·正则表达式·r语言·r语言-4.2.1
大侠归来19 分钟前
事务能回滚吗?Pipeline 算事务吗?
java·数据库·oracle
蜗牛互联网19 分钟前
Python调用Gemini Structured Outputs实现工单路由门禁
java·开发语言·人工智能·python
SEO_juper35 分钟前
给网页做可引用性评分:判断内容够不够让 AI 引用(GEO 工具,附代码)
开发语言·人工智能·爬虫·python·seo·独立站
Wang's Blog40 分钟前
Java 项目实战: 交友项目 - 产品定位、功能模块与客户端原型解读
java·开发语言·交友
Wang's Blog42 分钟前
Java 项目实战:交友项目 —— 项目导读与整体架构
java·架构·交友
今年下半年1 小时前
【短信发送】Spring Boot整合多种短信接口的实现(附源码)
java·spring boot·后端·sms·qcloudsms
盛世宏博北京1 小时前
十二防档案库房总线架构设计:恒湿消毒净化一体机 RS485 组网实战笔记
开发语言·笔记·php·恒湿机·档案八防温湿度
wespaul1 小时前
VeapAI 自然语言操作实战|第 04 篇:系统数据加工——把系统自身的元数据吃成知识
java·大数据·运维·数据库·人工智能