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())是为了:

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

对比

相关推荐
揽星河..2 分钟前
【C语言】底层程序设计
c语言·开发语言
JavaPub-rodert4 分钟前
从零搭建通用管理后台:ShiyuAdmin 的 Go、React 与 RBAC 实践
开发语言·react.js·golang
海的透彻1 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
code2cat1 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle
北京中科新远科技1 小时前
高速交换机端口预算怎么做?下行、上联、拆分和冗余计算框架
开发语言·php
xiaoye-duck2 小时前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(下):流式响应实现和测试
开发语言·网络·c++·语言模型
后台模板学习2 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
w_zero_one2 小时前
算法--构造
java·数据结构·算法
SL_staff2 小时前
制造业订单交付崩盘?用四层协同框架重建交付可信度(技术实践)
java·产品·全栈
AI源码2 小时前
基于 Python 的短视频用户行为分析系统
开发语言·python