asp.net core 应用程序中 Gen 2 中对象的奇怪堆积

问题描述 投票:0回答:1

我们在 dotnet 6 上有一个中型的 asp.net 项目。使用了 Newtonsoft.JSON 和 efcore 5。
它托管在由 AWS 上的 k8s 管理的 Linux 容器上。
我们看到节点由于内存问题一两天就会消失一次,它们有 4GB 可用 RAM。
在进行内存分析时,我注意到第 2 代中

RuntimeTypeHelper
GenericFieldInfo
RuntimeMethodHandler
的实例出现了奇怪的积累,在本地运行并浏览了大约 10-20 页的应用程序后,有数十万个实例一遍又一遍。是的,这些页面数据丰富,但无论如何,保留对象数量的稳定线性增长是可疑的。

dotMemory 显示它们是通过

ServiceProvider
保留的 并对其中的几个进行采样,它们有一些相当模糊的创建堆栈跟踪

我尝试将所有内容迁移到 dotnet 7,更新所有库并切换到 System.Text.Json,但这并没有明显改变整体情况。

这些物体堆积的原因可能是什么?或者相反,这是正常的,我应该关注内存压力并考虑减少其他地方的分配?

asp.net-core asp.net-web-api memory-management dependency-injection out-of-memory
1个回答
0
投票

问题最终是由我们使用 DI 引起的。

随着应用的演进和丰富的业务规则以及大量的依赖关系,导致一些核心服务被许多其他服务使用,而这些服务之间又可能存在相互依赖。再加上大多数服务被配置为“暂时”的事实,导致依赖关系图底部的一个服务可能已实例化数百次,或者在非常糟糕的情况下,对于单个树解析甚至数千次。这真的让我感到惊讶,因为我不认为依赖图是that不好的。 我们所做的是将大部分事情切换到

scoped

生命周期,这样深层子服务就不会被多次创建。

© www.soinside.com 2019 - 2024. All rights reserved.