在家过完了年,感觉精神很爽。明天大家可能都就上班了,新的一年开始了,希望大家新年新气象
。而其我已经发现一点点新年的灵感了哦~,我原来发现IE中的JScript解释器可能有的Memory Leak的问题,可老是早不到出问题的代码,今天一下就逮到了一个可以复现的case~~
想当初我做那个无刷新的JScript TreeView控件时,硬是被折磨坏了 。IE进程IEXPLORE.EXE的内存使用量常常串到200M左右,搞得我的JScript代码运行狂慢,有的时候展开一个Node需要好几秒钟@_@。
复现这个Bug的代码如下:
运行上面的代码,不断的点击"Generate Elements"按钮,IEXPORE.EXE的内存使用量(PM+VM)持续的上涨。这时不管你点"Refresh"还点"Go"按钮,IE的内存使用量始终不会减少 。除非关掉IE在重新打开,内存才能被释放。
问题出在上面示例代码中打" *"的那两句话上,只要注释掉任意一句,Refresh页面后,IEXPORE.EXE的内存使用量就会降到刚打开IE是那个水平上。
想当初我做那个无刷新的JScript TreeView控件时,硬是被折磨坏了 。IE进程IEXPLORE.EXE的内存使用量常常串到200M左右,搞得我的JScript代码运行狂慢,有的时候展开一个Node需要好几秒钟@_@。
复现这个Bug的代码如下:
<
html
>
< head >
< title >IE Memory Leak Bug </ title >
</ head >
< body >
< button onclick ="GenerateObjects(this)" >Append Elements </ button >
< div id ="container" ></ div >
< script language ="Javascript" >
function GenerateObjects(elmt)
{
var room = document.getElementById('container');
for ( var i = 0 ; i < 1000 ; ++ i )
{
var obj = new TestObject('__Object__' + i);
room.appendChild(obj.Render(document));
}
}
function TestObject(name)
{
this .m_Name = name;
this .m_Description = '';
this .m_Element = null ;
this .toString = function ()
{
return '[class TestObject]';
}
}
function TestObject.prototype.Render(doc)
{
var span = doc.createElement('SPAN');
*span.Object = this ;
* this.m_Element = span;
span.Name = this .m_Description;
span.innerText = this .m_Name;
span.style.display = 'block';
return span;
}
</ script >
</ body >
</ html >
< head >
< title >IE Memory Leak Bug </ title >
</ head >
< body >
< button onclick ="GenerateObjects(this)" >Append Elements </ button >
< div id ="container" ></ div >
< script language ="Javascript" >
function GenerateObjects(elmt)
{
var room = document.getElementById('container');
for ( var i = 0 ; i < 1000 ; ++ i )
{
var obj = new TestObject('__Object__' + i);
room.appendChild(obj.Render(document));
}
}
function TestObject(name)
{
this .m_Name = name;
this .m_Description = '';
this .m_Element = null ;
this .toString = function ()
{
return '[class TestObject]';
}
}
function TestObject.prototype.Render(doc)
{
var span = doc.createElement('SPAN');
*span.Object = this ;
* this.m_Element = span;
span.Name = this .m_Description;
span.innerText = this .m_Name;
span.style.display = 'block';
return span;
}
</ script >
</ body >
</ html >
运行上面的代码,不断的点击"Generate Elements"按钮,IEXPORE.EXE的内存使用量(PM+VM)持续的上涨。这时不管你点"Refresh"还点"Go"按钮,IE的内存使用量始终不会减少 。除非关掉IE在重新打开,内存才能被释放。
问题出在上面示例代码中打" *"的那两句话上,只要注释掉任意一句,Refresh页面后,IEXPORE.EXE的内存使用量就会降到刚打开IE是那个水平上。
有兴趣欢迎您测试一下这个例子,看看是不是会Memory Leak?
本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。