强引用会阻止对象被垃圾回收,weakmap 的弱引用则不干预回收;强引用如 map/对象属性使对象持续存活,weakmap 键仅“瞄一眼”,无其他强引用时对象立即可回收。

区分强引用和 WeakMap 的弱引用,关键看“对象是否因该引用而被强制留在内存中”——强引用会锁住对象不让回收;WeakMap 的引用则不会干预垃圾回收(GC)。
强引用:对象被“牢牢拽住”,GC 不敢动
只要一个对象被至少一个变量、属性或数组元素等直接持有,它就处于强引用状态。即使你显式删掉其他引用,只要 Map、Set、普通对象属性里还存着它,它就一直活着。
-
典型表现:把对象放进
Map或作为Object的属性值后,再将原变量设为null,对象仍可通过 Map 访问到 -
代码示意:
const obj = { id: 1 }; const map = new Map(); map.set('data', obj); obj = null; console.log(map.get('data')); // { id: 1 } —— 对象没被回收 - 后果风险:容易造成内存泄漏,尤其在长期运行的页面中缓存 DOM 元素或大型数据时
WeakMap 弱引用:只“瞄一眼”,不“拉住手”
WeakMap 的键必须是对象,但它对这个对象的引用是“弱”的——它不计入 GC 的存活判定。只要该对象没有其他强引用,哪怕 WeakMap 还记着它,GC 也能随时把它连同对应条目一起清理掉。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
典型表现:对象仅被 WeakMap 键引用,其他地方都断开后,再次
get返回undefined -
代码示意:
const obj = { id: 1 }; const wm = new WeakMap(); wm.set(obj, 'meta'); obj = null; // 唯一强引用消失 // 此时 wm 内部条目可能已被 GC 清理(不可预测但必然发生) console.log(wm.get(obj)); // undefined -
设计限制体现弱性:WeakMap 没有
size、不能keys()、不能遍历——因为它的内容随时可能被动变化,引擎不保证一致性
怎么快速判断某个引用是不是“强”的?
用一个简单原则检验:如果删掉所有其他变量/属性对该对象的指向后,它还能通过当前结构访问到,那当前结构持有的就是强引用。
-
Map、Array、Object属性、闭包变量 → 是强引用 -
WeakMap的键、WeakSet的成员 → 是弱引用 -
const x = {}和let y = x→ 两者都是强引用(只是多了一条线)
WeakMap 不是“替代品”,而是“专用工具”
它不提供遍历、不暴露数量、不接受原始值作键——这些不是缺陷,而是为“不干扰对象生命周期”做出的取舍。适合场景包括:
- 给 DOM 元素挂载临时状态(卸载后自动清理)
- 模拟类的真正私有字段(
this作键,私有数据作值) - 基于对象的缓存(对象销毁,缓存自然失效)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










