detached dom elements 导致的内存泄露问题

4,161 阅读1分钟

重要的事情说三遍:

一定要养成良好的编码习惯!

一定要养成良好的编码习惯!

一定要养成良好的编码习惯!

1. 发现问题

最近在做文档的解析和渲染,属于dom操作比较频繁的了。

一通写下来畅快淋漓,最后跑起来,诶?没问题还挺好,非常完美,多翻几页,任务管理器 浏览器占的内存要爆了,飙到了 5G,我的妈。

因为是内存问题,我们可以很快就想到利用 chrome 的快照功能。

image (7).png

2. 解决问题

建立第一个快照,并且按 shallow size 倒序排。

image (8).png

翻到第4页,建立第二个快照。

image (9).png

对比两个快照的增量

image (10).png

随便选中一个就定位了,然后咱们就对症下药了就行啦。

IMG_6884 (2).JPG

虽然不是我写的这块,但是我觉得我肯定也会写成这样,对自己就是这么自信!

3. 什么是 detached dom elements?

即使 dom elements 已经不在 dom tree 里了,但是他们的引用还保留着,那么这块 dom elements 所占的内存就不会被释放掉,因为引用还在,垃圾回收机制并不会因为它不在 dom tree 中了而去回收他。

4. 典型案例

 var example = document.createElement("p");
   example.id = "someText";
   document.body.appendChild(example);
   var value = {
    text: document.getElementById('someText')
   };
   function createFun() {
      value.text.innerHTML = "Javascript is not Java";
   }
   createFun();
   function deleteFun() {
   // 从 dom tree 中移除了,但是 value.text 对她的引用还在哟~
      document.body.removeChild(document.getElementById('someText'));
   }
   deleteFun();

我们看一下快照

image (11).png

这里有一个线上的 demo 大家可以点点看。 jec.fyi/demo/detach…

ball ball 大家一定要养成良好的编码习惯啊!!!一些蜜汁 bug 很可能就是编码习惯造成的。

参考文档:

www.tutorialspoint.com/how-can-det…