当应用程序处于最小负载时,我会在6-7小时内逐渐增加应用程序内的内存消耗.达到约. 4GB,重置应用程序池并重复该过程.
图1:显示8-9小时内的应用程序内存消耗
此应用程序使用存储库模式的变体,并确保我的ObjectContext实例在每个事务可行的最短时间内重新实例化和销毁.我还在所有存储库/接口上实现IDisposable以清理任何资源.
我已经使用内存分析器(如Red Gate的ANTS配置文件,WinDbg等)对应用程序进行了大量测试,但到目前为止还无法确定内存问题的确切原因,但是请注意以下内容:
A Red Gate ANTS profiler test shows that there are too many Entity
Framework MetadataWorkspaces being created,causing lots of extra
object mappings and associated sql command text to be held. There’s
also single instance of myEntities in a particular repository which
contains a MetadataWorkspace and the InitializerMetadata cache
contains 351 entries at the end of a stress test. These 351 entries
each have another copy of myEntities,each of those has a
MetadataWorkspace,and each of those has hundreds of object mappings.
我的核心解决方案结构如下:
>演示文稿 – ASP.NET MVC 3
>业务 – 对象,viewmodel,接口
>基础设施 – 实体框架模型
>数据访问 – ADO.NET直接数据访问
如果有人能够提供任何指示,我将非常感激.
解决方法
发布数据访问,因为您只使用EF,您可以使用简单的.AsNoTracking()方法获得快速改进.采用ServiceLocator来帮助您管理上下文池.
您还可以在ReadOnly情况下使用Dapper而不是EF.
最后,但并非最不重要的是,使用纯ADO.NET,用于更复杂的查询和最快的执行.
重构你的ActionFilters以避免使用一些所有控制器继承的“BaseController”也是一个好习惯.
检查你的IDisposable类是否真的被CG压制,采用.Dispose(bool)模式.
确保您不会永久保留缓存变量,只会由应用程序池循环释放.