想當初我做那個無刷新的JScript TreeView控件時,硬是被折磨壞了。IE進程IEXPLORE.EXE的內存使用量常常串到200M左右,搞得我的JScript代碼運行狂慢,有的時候展開一個Node需要好幾秒鐘@_@。
復現這個Bug的代碼如下:
<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?
相關文章:
·繼續來研究JScript解析引擎的GC問題