轉自: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
并不知道您以后不會運行操縱您剛剛創建的所有這些對象的腳本。
當頁面消失時(當您瀏覽完,離開瀏覽器時)會釋放內存。它不會泄漏。當銷毀頁面時,會中斷循環引用。