转自:http://www.microsoft.com/china/msdn/library/webservices/WebApp/mac0301WebQA.mspx?mfr=true
问:我有一些关于 JScript® 中垃圾回收的问题。我认为在 Microsoft® Internet Explorer 6.0
中有内存泄漏,但在另一方面,它可能是循环引用问题。在我的代码中,我假设“new Object()”属于
JScript,而“document.createElement”属于 Internet Explorer DOM,因此 JScript
中的垃圾回收器无法释放 DOM 元素。这正确吗?避免这一问题的最佳方法是什么呢?
当您将代码加载到 Internet Explorer 6.0 中并单击“Refresh”时,您可以在“Task Manager”中观察到内存增加:
<html>
<body>
<script type="text/JScript">
for (i=0; i<1000; i++) { // this loop enforces the effect
var model = new Object();
var element = document.createElement("<br>");
model.myElement = element;
element.myModel = model;
model = null;
element = null;
}
</script>
</body>
</html>
答:这不是内存泄漏。您正在页面上创建新文本一千次!这会使页面变大。如果您创建了许多无法获得也无法释放的对象,那才是内存泄漏。在
这里,您将创建许多元素,Internet Explorer 需要保存它们以正确呈现页面。Internet Explorer
并不知道您以后不会运行操纵您刚刚创建的所有这些对象的脚本。
当页面消失时(当您浏览完,离开浏览器时)会释放内存。它不会泄漏。当销毁页面时,会中断循环引用。