dotnet 应用程序的预期内存大小与 Linux 下实际消耗的内存不匹配

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

我希望能够帮助您了解内存转储的大小。 背景:我有一个在容器中运行的 net7 控制台应用程序(主应用程序),该容器与另一个 net7 控制台应用程序(sidecar)一起托管在 Kubernetes 中。 测试场景下主应用程序的内存为

~570MB
,我得到了完整的内存转储(使用 procdump for linux 或 dotnet dump)。根据目标环境,我需要减少容器的内存,并开始分析内存中的内容以了解是什么消耗了这么多。

所有 GC 堆的大小合计:94MB 模块大小:69,3MB 本机堆大小:51.8 MB 嵌入资源(例如位图):0 线程数:49(总计),20(活动)

我的粗略尺寸计算是: GCHeap (94) + 2* 模块 (69,3) + 本机堆 (51,8) + 1MB * 线程 (49) =

333,4MB
(我将模块的大小加倍,作为抖动组件的近似值)

--> 我预期的内存使用量和实际消耗的内存量之间的差异是

~ 238MB (42%)

我想念什么? 有人可以给我指出任何文档/工具/等吗?了解意外的记忆从何而来?

我尝试分析 dotMemory 和 dotnet dump 中的转储,但卡住了,因为我发现的数字看起来不错,但消耗的总内存是如此之高。

c# .net linux dump
1个回答
0
投票

某些内存可能由托管堆保留,但由于堆碎片而未使用。值“GCHeap 94MB”包含完整堆大小还是仅包含已分配对象的大小? 您能否在 dotMemory 中打开此转储并附上

Inspections | Heap fragmentation
部分的屏幕截图?

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