并发垃圾回收的.Net 4 MemoryCache泄漏
||
我正在.Net 4中使用新的MemoryCache,最大缓存大小限制为MB(我已经测试了它的设置在10到200MB之间,在内存为1.75到8GB之间的系统上)。我没有在对象上设置任何基于时间的到期,因为我只是将缓存用作高性能驱动器,并且只要有空间,我都希望使用它。令我惊讶的是,缓存拒绝逐出任何对象,以至于我将得到“ 0”异常。
我启动了perfmon,将我的应用程序连接到
.Net CLR Memory\\#Bytes In All Heaps
,.Net Memory Cache 4.0
和ѭ3indeed -确实,内存消耗已失控,并且未注册任何缓存修剪。
做了一些谷歌搜索和stackoverflowing,下载并附加了CLRProfiler,并且感到震惊:无处不在!根据我设置的内存大小限制,内存处于合理范围内。再次以调试模式运行它,没有逐出。 CLRProfiler再次驱逐。
我终于注意到,探查器强制应用程序在不进行并发垃圾收集的情况下运行(另请参见有用的SO并发垃圾收集问题)。我在我的app.config中将其关闭,而且,确实有逐出!
这似乎充其量是因为缺少文档,这简直是令人发指的缺乏:这仅适用于非并发垃圾收集-尽管我自从ASP.NET移植以来就对其进行了映像,但他们可能不必担心并发垃圾收集。
那么还有其他人看到吗?我想从那里获得其他一些经验,也许还有一些受过教育的见解。
更新1
我在一个方法中重现了该问题:似乎必须并行写入缓存,以使缓存逐出不触发(在并发垃圾收集模式下)。如果有兴趣,我会将测试代码上传到公共存储库中。我肯定会进入CLR / GC / MemoryCache池的最深处,我想我忘记了浮动信息...
更新2
我在CodePlex上发布了测试代码以重现此问题。另外,可能感兴趣的是,原始生产代码作为工作角色在Azure中运行。有趣的是,更改角色的app.config中的GC并发设置无效。可能Azure会像ASP.NET一样覆盖GC设置吗?此外,在WPF和控制台应用程序下运行测试代码将产生稍微不同的驱逐结果。
没有找到相关结果
已邀请:
4 个回复
物崎巩
就在方法末尾(确保释放所有句柄以引用对象并将它们归零)。如果这防止内存泄漏,然后是,则可能存在运行时错误。
邵酮
逝媳蘑贩茄
脾萌