直接检查堆快照中挂载在window或globalthis上的异常大对象,顺藤摸瓜定位未声明变量、this指向错误、esm顶层漏写const/let/var等隐式全局泄漏源。

直接看堆快照里挂载在 window 或 globalThis 上的异常大对象,再顺藤摸瓜确认是不是没声明、this 指向错、或模块顶层漏写 const/let/var 造成的——这类泄漏不报错、不卡顿,但对象永远活在内存里。
一眼识别可疑代码模式
不用等线上报警,翻代码就能提前发现风险点:
- 函数里直接写
data = []、cache = new Map(),没加任何声明关键词 - 普通函数调用时用了
this.xxx = value,比如init();而不是new Init()或init.call(obj) - ESM 模块文件最外层写了
tempList = document.querySelectorAll('.item'),没加const - 控制台调试后忘了清理,留着
result = await fetch(...)这类临时变量
用 Chrome DevTools 快速定位真实泄漏源
打开 Memory 面板,按步骤操作:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 点击 Take heap snapshot 拍下初始快照
- 执行疑似泄漏的操作(比如反复进入某个页面、触发某段逻辑)
- 再拍一次快照,切换到 Comparison 视图,筛选 Constructor 为
Object或Array,Size Delta 明显增长的项 - 在搜索框输入
filter:window.或filter:globalThis.,找名字像tempData、nodeListCache这类“不像全局变量”的属性 - 点开目标对象,在右侧 Retainers 标签里确认路径是否为
window.xxx或globalThis.xxx
运行时主动监控全局膨胀
开发阶段加一段轻量脚本,比等用户反馈更快发现问题:
- 页面加载后立刻记录:
const initKeys = Object.keys(globalThis).length; - 定时检查(例如每5秒):
if (Object.keys(globalThis).length > initKeys + 20) { console.warn('全局属性突增', Object.keys(globalThis).slice(initKeys)); } - 配合 ESLint 开启
no-implicit-globals和no-unused-vars,CI 构建时直接拦截
修复必须从源头切断,不能靠事后清空
删 window.xxx 只是掩耳盗铃,关键要让变量根本挂不上全局:
- 全项目加
"use strict"—— 未声明赋值直接报错,不给挂载机会 - 优先使用 ESM 模块(
.mjs或<script type="module"></script>),模块默认严格模式 - 真需要跨模块共享数据,统一走单例导出:
export const appCache = new Map();,别碰window - 第三方库若非严格模式,用
import引入而非<script src></script>,避免污染全局










