了解Chrome中的内存泄漏以及“发现DOM漏洞”'例如

时间:2015-08-28 16:16:47

标签: javascript google-chrome dom memory-leaks profiling

在Chrome文档的this page上,他们提供了以下代码示例:

function start()
{
    var p = document.getElementById("p");
    detached = document.createElement("div");
    p.appendChild(detached);
    p.removeChild(detached);
    //Fill up detached with a bunch of garbage data
}

然后他们声称这是泄漏,因为

  

.. DOM节点与树分离,但它仍然保存引用脚本数据的DOM包装器对象,有效地阻止了数据的收集。

这对我没有意义。

  1. 问题不仅仅是detached仍被脚本引用(因为它是一个闭包)?不应该detached = null足以让GC收集detached并删除泄漏吗?
  2. 如果p被移除,为什么detached仍然会引用p.appendChild(detached); p.removeChild(detached); ?如果(1)为真,则不应该

    app:popupTheme="@style/MyCustomOverflowTheme"
    

    什么都不做?

1 个答案:

答案 0 :(得分:2)

是的,这是写得很糟糕的文档。如果fill()方法曾经引用过全局对象(例如fill2()),那么这句话就有意义了,所以我怀疑示例代码在某些时候发生了变化。

detached = null将根据以下示例解决内存泄漏问题。

function start()
{
  var p = document.getElementsByTagName("div")[0];
  detached = document.createElement("div");
  p.appendChild(detached);
  p.removeChild(detached);
  fill();
}

function fix()
{
  detached = null;
}

function fill()
{
  for (var i = 0; i < 25; ++i) {
    var div = document.createElement('div');
    div.data = new Array(10000);
    for (var j = 0, l = div.data.length; j < l; ++j)
      div.data[j] = j.toString();
    detached.appendChild(div);
  }
}

function fill2()
{
  window.data = new Array(10000);
  for (var j = 0, l = window.data.length; j < l; ++j)
    window.data[j] = j.toString();

  for (var i = 0; i < 25; ++i) {
    var div = document.createElement('div');
    div.data = window.data;
    detached.appendChild(div);
  }
}