System.Security.Policy.Evidence,Web服务和吹嘘LoH

时间:2009-05-20 18:25:44

标签: c# .net out-of-memory heap-fragmentation

已开发的新应用程序大量使用Web服务。我们开始定期打出内存异常(随着使用量的增加)。在查看内存转储时,我注意到有大量相同大小的byte []。查看这些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框架必须将整个程序集加载到内存中以检查策略,并希望看看是否有其他人遇到过此问题以及您的解决方案是什么。

谢谢, 丹

1 个答案:

答案 0 :(得分:1)

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

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

当前版本的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 Cache中的所有内容。我认为这就是我们看到问题的原因:虽然修补程序停止了ASP.NET缓存自动从缓存中清除这些程序集,但我们的代码正在进行并手动清除缓存。

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