|
WEB Q&A...
JScript 内存泄露、获取 XmlDataDocument 以及 ASPX 包含页面
原著:Nancy Michell
翻译:宋文锋 逆风者
原文出处:MSDN
Magazine Apr. 2004(Web Q&A)
我创建了一个 Web 应用程序,它的界面功能十分丰富。这个程序主要是由 XML、XSLT
和 JScript 构建的。我遇到了一个大问题就是它消耗了大量的内存,但我不知道为何会出现这种情况。我使用
闭合函数(closures:一种在函数中定义函数的方法)来实现事件处理,我怀疑就是使用它才导致的内存泄露。
用闭合函数作为事件处理的实现,是导致内存泄露的普遍原因。闭合函数总是允许内部函数访问外部函数的参数和变量。
Eric Lippert 的 Blog (译者:Web Log 的简称)上有一篇关于闭合函数和内存泄露的文章:What
are closures?。然而请注意,在这篇文章截稿前仍旧有一个错误没有改正。当微软IE浏览器导航到某一页时
,循环引用会使效率下降的说法并不正确。几年前当这个问题第一次出现时,并没有造成很大影响,但是IE团队发现它影响很多现存的页面,所以还是关闭了此项功能
。
创建一个界面功能丰富的 Web 应用程序,就像你前面所叙述的。首先这不是一个好想法,它会导致软件过于臃肿以至于泄漏内存。这方面内容请参见:Thin
To My Chagrin
根据函数是否被动态地创建来谨慎地使用闭合函数语义。如果函数是被动态地创建,例如通过 new 操作符来声明,那么你应该寻找一种方法来避免这么做。使用New表达式生成的函数相当于使用Eval表达式,而Eval表达式会影响性能。它会执行编译过程。如果这个函数需要被动态地创建,并且可以不需要使用闭合函数语
义,那么将发生器放到一个辅助函数中,该辅助函数没有那些会形成循环引用的参数。这样,所产生的函数将会在一些不需要回指向IE对象模型的事件前结束。如果这个函数是静态创建的,不需要使用闭合函数语
义,就不要将它嵌入到其它函数中。并且重构你的应用程序直到你脱离这种困境。
我怎样才能确定 XmlDataDocument与 DataSet 是关联的?如果我采用下面的代码来从 DataSet 中创建一个XmlDataDocument:
便很容易获得与这个 XmlDataDocument 相一致的 DataSet,如下所示:
DataSet dataset = xmlData.DataSet;
然而,一旦XmlDataDocument与DataSet的关联关系建立起来,我怎样才能确定这个XmlDataDocument确实来自于DataSet呢?这很重要,因为如果我试图为DataSet创建第二个XmlDataDocument时,会抛出一个异常。
我依赖于DataSet。在许多方法中, 我以XML的格式来操作数据.
当DataSet在方法间被传递时,XmlDataDocumnet是否被创建了,它的引用是什么,我需要知道调用这些方法时其内部操作的相关知识。
没有简单的方法。很不幸,DataSet不提供任何公有的API来检查一个 XmlDataDocument 是否与之相关或者提供它的一个引用。
然而,作为一个折中的办法,你可以选择以下两条之一来解决:
-
总是在一个Try-Catch块中实例化 XmlDataDocument,并且捕获异常变量,如果DataSet已经与一个 XmlDataDocument 相关联,那么就会抛出异常。
-
利用程序跟踪判断 DataSet 实例是否已经与一个 XmlDataDocument 相关联。
之后你可以使用 DataSet.ExtendedProperty 创建一个用户自定义属性来保持对一个不知道是否被关联的 XmlDataDocument 的跟踪。
本文章更多内容:1 - 2 - 3 - 4 - 下一页>> |