IE的JScript解析器可能有Memory Leak-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

IE的JScript解析器可能有Memory Leak

简介:
  在家过完了年,感觉精神很爽。明天大家可能都就上班了,新的一年开始了,希望大家新年新气象emteeth.gif。而其我已经发现一点点新年的灵感了哦~,我原来发现IE中的JScript解释器可能有的Memory Leak的问题,可老是早不到出问题的代码,今天一下就逮到了一个可以复现的case~~

    想当初我做那个无刷新的JScript TreeView控件时,硬是被折磨坏了emcry.gif。IE进程IEXPLORE.EXE的内存使用量常常串到200M左右,搞得我的JScript代码运行狂慢,有的时候展开一个Node需要好几秒钟@_@。

    复现这个Bug的代码如下:
None.gif<html>
None.gif<head>
None.gif    <title>IE Memory Leak Bug</title>
None.gif</head>
None.gif<body>
None.gif<button onclick="GenerateObjects(this)">Append Elements</button>
None.gif<div id="container"></div>
ExpandedBlockStart.gif    <script language="Javascript">
InBlock.gif
function GenerateObjects(elmt)
ExpandedSubBlockStart.gif
{
InBlock.gif    
var room = document.getElementById('container');
InBlock.gif    
for ( var i=0 ; i < 1000 ; ++i )
ExpandedSubBlockStart.gif    
{
InBlock.gif         
var obj = new TestObject('__Object__' + i);
InBlock.gif         room.appendChild(obj.Render(document));
ExpandedSubBlockEnd.gif    }
 
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
function TestObject(name)
ExpandedSubBlockStart.gif
{
InBlock.gif     
this.m_Name = name;
InBlock.gif     
this.m_Description = '';
InBlock.gif     
this.m_Element = null;
InBlock.gif     
InBlock.gif     
this.toString = function()
ExpandedSubBlockStart.gif     
{
InBlock.gif         
return '[class TestObject]'; 
ExpandedSubBlockEnd.gif     }

ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
function TestObject.prototype.Render(doc)
ExpandedSubBlockStart.gif
{
InBlock.gif     
var span = doc.createElement('SPAN');
InBlock.gif    *span.Object 
= this;
InBlock.gif    *
this.m_Element = span;
InBlock.gif
     
InBlock.gif     span.Name 
= this.m_Description;
InBlock.gif     span.innerText 
= this.m_Name;
InBlock.gif     span.style.display 
= 'block';
InBlock.gif     
return span;
ExpandedBlockEnd.gif}

None.gif
</script>
None.gif</body>
None.gif</html>
None.gif

    运行上面的代码,不断的点击"Generate Elements"按钮,IEXPORE.EXE的内存使用量(PM+VM)持续的上涨。这时不管你点"Refresh"还点"Go"按钮,IE的内存使用量始终不会减少hitwall.gifhitwall.gifhitwall.gif。除非关掉IE在重新打开,内存才能被释放。

    问题出在上面示例代码中打"*"的那两句话上,只要注释掉任意一句,Refresh页面后,IEXPORE.EXE的内存使用量就会降到刚打开IE是那个水平上。

    有兴趣欢迎您测试一下这个例子,看看是不是会Memory Leak?


本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章
最新文章
相关文章