问:我有一些关于 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 并不知道您以后不会运行操纵您刚刚创建的所有这些对象的脚本。
当页面消失时(当您浏览完,离开浏览器时)会释放内存。它不会泄漏。当销毁页面时,会中断循环引用。
问:我试图通过将 XML 传递给将由 ADO.NET SQL 提供程序调用的存储过程,来将一些 XML 导入数据库。当 XML 文件太大时,它会由于 SqlException 异常(表示发生了严重错误)而失败。我追踪到 sp_xml_preparedocument 时失败了。
使用具有 43403 个字符的 XML 文件时,它运行良好,但是如果我再增加一个字符(通过将最后的 Vendor 字段从“Micros”更改为“Microso”)