Performance面板通过Nodes曲线盯GC频率:录制前手动GC清基线,勾选Memory和Screenshots,执行闭环操作后观察Nodes柱状图——若每轮峰值递增且回落不到基线,或1秒内陡降超3次,即暴露泄漏与掉帧风险。
GC 频率本身不是问题,但密集、耗时、发生在交互帧内的 GC 才是中端设备卡顿的直接推手。Performance 面板里的灰色 Nodes 柱状图比 JS Heap 更早暴露泄漏——它反映的是 DOM 引用计数,只要节点没被真正释放,它立刻拉高。
实操建议:
立即学习“前端免费学习笔记(深入)”;
Collect garbage,清空基线Memory 和 Screenshots,只做目标操作(比如滚动加载 10 轮数据)Nodes 曲线:如果每轮峰值都比上一轮高,且回落不到初始值,就是泄漏铁证$$('*').length 比任务管理器更可靠Chrome 任务管理器里内存涨了 200MB,可能是 GPU 纹理或字体缓存占的;但 $$('*').length 是真实 DOM 节点总数,只增不减就说明有节点没被回收。
实操建议:
立即学习“前端免费学习笔记(深入)”;
$$('*').length 记下基线(如 1247892)$$('*').length,若每次 +3000+ 且连续 3 次不回落,基本锁定泄漏document.querySelectorAll('body *').length,差 10 倍以上说明有 iframe 或 Shadow DOM 干扰,得单独查Detached 节点是“已从文档移除但 JS 还强引用着”的典型泄漏信号。它们不渲染、不响应,却拖慢 GC、吃内存。
实操建议:
立即学习“前端免费学习笔记(深入)”;
Collect garbage,再拍第二张快照HTMLDivElement、Text,看 Delta 是否为正且数量异常(比如多出 4821 个)Retainers 里顺藤摸瓜:若路径含 Closure → function → (anonymous) → element,说明事件监听器闭包没清理disconnectedCallback
大屏里滚动复用节点时,disconnectedCallback 根本不会触发——浏览器认为“还是同一个节点”,不走生命周期。指望它清理定时器或事件监听器,等于放任泄漏。
实操建议:
立即学习“前端免费学习笔记(深入)”;
removeChild() + appendChild(),这三类场景下 disconnectedCallback 全部失效setInterval 实例,运行 8 小时后内存抖动明显Map 池化节点:node.style.display = 'none'(不 detach),靠 dataset.id 管理复用,更新内容而非重建