2

已开发的新应用程序大量使用 Web 服务。我们开始定期处理内存不足异常(随着使用量的增加)。在查看内存转储时,我注意到有大量相同大小的字节 []。查看这些 byte[] 的句柄,我注意到它们被 System.Security.Policy.Evidence 引用

经过进一步审查,我将这些内存分配确定为其中包含我们的 Web 服务类的实际程序集 (dll)(特别是其中 2 个程序集在内存中的 128 次和 115 次)。我在这里找到了一些信息-> blogs.msdn.com/tess/archive/2008/06/25/asp-net-memory-leak-byte-arrays-rooted-in-system-security-policy-evidence.aspx

在这里 --> blogs.javista.com/2009/03/18/best-practices-for-crm-memory-usage/

但我还没有找到很多关于这个问题的其他参考资料。(.NET 框架将 Web 服务程序集加载到内存中以检查安全策略)。

目前,我看到的唯一解决方案之一是将 Web 服务的程序集分成引用库的较小程序集。

我很困惑为什么 .NET 框架必须将整个程序集加载到内存中以检查策略,并想看看其他人是否遇到过这个问题以及您的解决方案是什么。

谢谢,丹

4

1 回答 1

1

我在 Framework 3.5 SP1 的内存转储中看到了同样的情况。

Tess 的博客谈到这些程序集被存储在 ASP.NET 缓存中,以及缓存刷新程序集,导致它们被重新加载。建议是当系统内存不足时缓存将刷新它们,这是 ASP.NET 缓存中任何内容的默认行为。苔丝说修补程序解决了这个问题。

当前版本的 System.Web.Services 包含在 System.Web.Services.Protocols.ServerProcotol 的 AddToCache 方法中:

        HttpRuntime.Cache.Insert(this.CreateKey(protocolType, serverType), value, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, null);

请注意,这是明确将缓存项设置为永不过期且永不可移除。我想这就是修补程序为解决问题而更改的内容——不再自动刷新缓存。

现在,在遇到此问题的应用程序中,我们有一些代码在某些情况下手动清除 ASP.NET 缓存中的所有内容。我认为这就是我们看到问题的原因:虽然修补程序停止了 ASP.NET 缓存自动从缓存中清除这些程序集,但我们的代码正在出现并手动清除缓存。

我想知道您的应用程序(或其任何第三方组件)是否正在对可能删除这些项目的缓存做任何事情?

于 2009-06-17T05:07:17.743 回答