asp.net-mvc – .NET MVC / Entity Framework应用程序中的内存使用率过高

我有一个相对较大的实体框架模型(约300个表),我预先生成视图以提高查询/应用程序性能.

当应用程序处于最小负载时,我会在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.可以,可以不是.我们应该注意很多要点,而不仅仅是数据访问基础设施.

发布数据访问,因为您只使用EF,您可以使用简单的.AsNoTracking()方法获得快速改进.采用ServiceLocator来帮助您管理上下文池.

您还可以在ReadOnly情况下使用Dapper而不是EF.

最后,但并非最不重要的是,使用纯ADO.NET,用于更复杂的查询和最快的执行.

重构你的ActionFilters以避免使用一些所有控制器继承的“BaseController”也是一个好习惯.

检查你的Idisposable类是否真的被CG压制,采用.dispose(bool)模式.

确保您不会永久保留缓存变量,只会由应用程序池循环释放.

这只是提示,但努力工作将伴随您,具有代码访问权限.

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....