[运行DNN前端网站(主要包含WebForm和MVC模块)的azure应用程序服务上发生内存泄漏。
我通过dotMemory运行了内存转储,发现迄今为止最大的保留大小已由ViewEngineCollection对象类型占用。
据我所知,它应该包含Razor视图引擎以及该Web应用程序中使用的任何其他引擎。
我发现,每个MVC对象的每个实例都作为视图引擎添加到集合中,并且永远不会被垃圾回收-占用了数GB的内存。内存转储时,Gen2内存中有90%以上的内存,因此它们的寿命很长。
考虑一个MVC模块MyMVCModule。假设.cshtml中有一个动作标签,其中包含动态生成的url-似乎在实例化MVC对象时,对象比较器会确定与集合中已有的其他对象的等效性。同一模块版本上的任何细微差异都会导致将其作为“新”引擎添加到内存中。我相信这是一个缓存功能,但是排列如此之多,以至于数量级的存储成本超过了重新实例化MVC对象的成本。内存中有成千上万个模块的副本。
该词典是ModuleDelegatingViewEngine的子级,它是dnn特定的组件,因此,我不认为这个问题通常与MVC框架有关。
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9PWHJpVC5wbmcifQ==” alt =“ dotMemory输出的部分屏幕截图”>
这是通常的行为吗?如果是这样,有没有办法让我的垃圾收集器更早地清除这些页面?谢谢您的帮助。
为您提供的一些答案/笔记。不是100%的答案,而是超过评论。
您能否确认您正在使用哪个特定的9.x版本?还可以提交示例模块吗?