weakmap 防止内存泄漏的关键在于正确组织使用方式:顶层声明唯一实例、键必须为有效对象、值不反向引用键、不用于遍历或缓存。

必须把 WeakMap 声明在模块顶层
WeakMap 实例要全局唯一、复用,不能在构造函数或方法里反复新建:
- ✅ 正确:在文件最外层声明一次,所有实例共用同一个 WeakMap
- ❌ 错误:每次 new 类时都 new WeakMap(),既失去弱引用意义,又浪费内存
键只能是真实存在的对象,且需校验类型
WeakMap 只接受对象作键,但不是所有对象都适合;尤其操作 DOM 时,容易传入 null 或非 Node 实例:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 务必检查:
node && node instanceof Node(DOM 场景)或obj && typeof obj === 'object'(通用场景) - 不能用字符串 ID、数字、null、undefined 当键,否则直接抛
TypeError - 动态获取的 DOM 元素可能为 null,
document.getElementById('x')后要先判断再 set
值的内容也要注意生命周期对齐
WeakMap 只弱引用“键”,不弱引用“值”。如果值里存了对键本身的强引用,或被长周期闭包持有,照样泄漏:
- 避免在私有数据中写
{ owner: this }这类反向引用 - 不要把
get()返回的对象塞进定时器回调、未注销的事件监听器或全局缓存中 - 值本身应轻量,且生命周期自然跟随键对象(比如仅存计数器、标志位、临时状态)
别指望它能主动清理或遍历
WeakMap 没有 size、keys()、forEach(),也不能清空全部条目:
- 它不是缓存工具,不适合需要批量管理、主动淘汰的场景
- 调用
has()或get()返回undefined,不一定代表没设过,也可能键已被 GC 回收 - 不需要手动
delete—— 对象销毁后,对应条目自动失效,强行 delete 是多余操作
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










