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 ">
</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);
这几句注释掉才恐怖呢。离开页面内存都不能释放。连刷几次就占光你内存了。