技术开发 频道

.NET尚未暴露的问题——内存泄漏

  【IT168技术新闻】有专家研究发现.NET尚未暴露的内存泄漏问题由使用动态代码生成器引起的。据悉,在一个nut shell中,在XML序列化、正则表达式和XSLT变换中使用动态代码生成器极有可能导致内存泄漏。

   虽然,通用语言运行时(CLR)可以卸载整个应用程序域,但是它不能卸载单独的集合。而代码生成器依赖于创建临时集合。这些集合被载入初始应用程序域(app domain)中,这就意味着它们不能被卸载,直到应用程序退出。

   这一问题对于有些库,如XML序列库来说,并不能称的上一个大问题。通常为给定类型的序列化代码被存储在缓存区,这样限制了应用程序为每一个类型创建一个临时集合。但是,有的XMLSerializer过载(overloads)不使用缓存。如果一个开发人员使用其中一个不提供某种应用程序级cache的序列化器,内存可能在同一代码的新实例载入内存时被慢慢的泄漏。如果您想获得更多的有关XML的信息,请参阅文章.NET Memory Leak: XmlSerializing your way to a Memory Leak。

   这一潜在的问题对那些在运行时习惯性重写自己的代码,如LISP中的代码,来说其后果更为严重。对于这种类型的语言,要么代码被完全解释后再执行,而不经过中间语言代码阶段;要么代码被放置在单独AppDomain中,可以被不时的清除。不管采用上述哪种方法,都对以通用语言运行时(CLR)为目标的语言开发人员提出了挑战。

0
相关文章