日期:2014-05-16  浏览次数:20389 次

IE JScript第3种内存泄漏方式的问题。如果没有人能回答我得上微软那里问了。
http://msdn2.microsoft.com/en-us/library/Bb250448.aspx
这篇文章相信大家都看过了,我英文不太好,对第三种泄漏方式有个问题想问。

第三种方式叫Cross-Page   Leaks,好像是说往dom里加元素的次序如果不对,就会因为产生临时对象没有释放而内存泄漏。

文中给了一例子:
function   LeakMemory()
{
var   hostElement   =   document.getElementById( "hostElement ");

//   Do   it   a   lot,   look   at   Task   Manager   for   memory   response

for(i   =   0;   i   <   5000;   i++)
{
var   parentDiv   =
document.createElement( " <div   onClick= 'foo() '> ");
var   childDiv   =
document.createElement( " <div   onClick= 'foo() '> ");

//   This   will   leak   a   temporary   object
parentDiv.appendChild(childDiv);
hostElement.appendChild(parentDiv);
hostElement.removeChild(parentDiv);
parentDiv.removeChild(childDiv);
parentDiv   =   null;
childDiv   =   null;
}
hostElement   =   null;
}
这个例子的确是会泄漏内存,从任务管理器可以看到IE一下就占80M内存,但如果把onClick= 'foo() '去掉,就正常了,任务管理器看到IE只点十几M内存。现在的问题是:
1、为什么去掉onClick= 'foo() '就正常了呢?我试过在去掉onClick= 'foo() '后,再加一些别的东西,例如:style= "border:1px   solid   #FF0000 ",   但内存占用都没有明显的增加。

2、把onClick= 'foo() '去掉后还有没有内存泄漏?虽然任务管理器里没看到内存占用明显地增加,但可能泄漏量小,看不出来。

------解决方案--------------------
onClick = 'foo() ',至少需要个指向函数的指针吧,指针也占用内存空间,所以....
以上是个人意见.
------解决方案--------------------
我觉得可能CPU的时间用在初始化函数上了,如果换成下面这样就会比原来的时间快一些。使用下面的方法CPU100%应该已经不是函数的问题了,因为可以看到使用style= "border:1px solid #FF0000 "这个时候也是需要一定的时间,因为生成的量比较大。虽然使用下面的方法会快,但是foo函数如果不定义会出错,也就是说foo函数在下面的例子中是已经初始化了的,所以后面执行会变快
<div id= "hostElement "> &nbsp;
</div>
<script language=javascript>
function foo()
{
}
function LeakMemory()
{
var hostElement = document.getElementById( "hostElement ");

// Do it a lot, look at Task Manager for memory response

for(i = 0; i < 5000; i++)
{
var parentDiv =document.createElement( " <div> ");
//document.createElement( " <div onclick= 'foo() '> ");

parentDiv.onclick=foo;
var childDiv =document.createElement( " <div> ");
//document.createElement( " <div onclick= 'foo() '> ");

childDiv.onclick=foo;

// This will leak a temporary object
parentDiv.appendChild(childDiv);
hostElement.appendChild(parentDiv);
hostElement.removeChild(parentDiv);
parentDiv.removeChild(childDiv);
parentDiv = null;
childDiv = null;
}
hostElement = null;
alert( "done ")
}
LeakMemory();
</script>
------解决方案--------------------
m
------解决方案--------------------
这个泄露不算什么。你把
parentDiv.appendChild(childDiv);
hostElement.appendChild(parentDiv);
hostElement.removeChild(parentDiv);
parentDiv.removeChild(childDiv);

这几句注释掉才恐怖呢。离开页面内存都不能释放。连刷几次就占光你内存了。