核心是主动切断不该存在的引用链;需及时清理定时器id、解绑事件监听器、避免闭包长期持有dom或大对象,优先使用weakmap/weakset和useeffect清理函数。

核心是让对象及时“断连”——只要没有强引用指向它,垃圾回收器就能把它收走。关键不在等 GC,而在主动切断不该存在的引用链。
清理定时器和回调函数
setInterval 和 setTimeout 返回的 ID 必须保存,并在不需要时显式清除。尤其在组件卸载、页面跳转或条件退出时,漏掉这一步会让回调持续持有外部变量,内存就悄悄涨起来了。
- 始终用 const timerId = setInterval(...) 保存句柄,不用就 clearInterval(timerId)
- 在 React 中,用 useEffect 的清理函数;Vue 中用 beforeUnmount 或 onBeforeUnmount
- 异步操作(如 fetch)配合 AbortController,避免请求返回后更新已销毁组件的状态
解绑事件监听器
addEventListener 添加的监听器不会随 DOM 元素移除而自动消失。如果元素被 remove() 或 innerHTML 替换,但监听器还在,它连带闭包里的上下文就一直留在内存里。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 添加时用具名函数,解绑时才能精准匹配:element.addEventListener('click', handler) → element.removeEventListener('click', handler)
- 优先使用事件委托,减少监听器数量;或用 once: true 选项,触发一次即自动销毁
- 现代写法推荐用 useEffect 返回清理函数,或封装成自定义 Hook 统一管理
谨慎处理闭包与 DOM 引用
闭包本身不泄漏,但它捕获的变量如果长期存活(比如缓存了大数组、整个 DOM 节点树),就会拖住整块内存。DOM 引用尤其危险:节点从页面移除后,JS 里还留着它的引用,它就变成“游离节点”,无法被回收。
- 避免在闭包中长期持有大型数据或 DOM 元素;用完即设为 null
- 移除 DOM 元素前,先调用 removeEventListener,再 element.remove();不要只靠 innerHTML = ''
- 缓存 DOM 节点时,优先用局部变量,而非模块级或全局变量;组件销毁时清空引用
用弱引用结构管理关联数据
普通 Map 或 Object 作为缓存键时,会阻止键对象被回收。WeakMap 和 WeakSet 则不同:它们的键是弱引用,当 DOM 节点或其他对象不再被其他地方引用时,即使 WeakMap 还存着它,也能被 GC 正常回收。
- 给 DOM 节点附加元数据,用 new WeakMap() 而不是 new Map()
- 需要临时跟踪对象是否被处理过,用 WeakSet 更安全
- TypeScript 5.2+ 可用 using 声明资源,确保离开作用域时自动调用 Symbol.dispose,适合数据库连接、文件句柄等
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










