在从dotnet 5移植到dotnet 6之后,一个后端应用程序消耗了大量的“非托管内存”。它是一个托管在Linux上的复杂的F#应用程序,运行多个进程,大量的来自EventStore的消息序列化,并使用AKKA .NET实现了演员模型。
移植期间无重大代码变更。
dotnet 5的屏幕截图
dotnet 6的屏幕截图
非托管内存的峰值可以达到6 GB,如果进程保持空闲(EventStore中没有消息),它将释放一些非托管内存并稳定在3-4 GB左右。
其他详细信息
- 最低配置:操作系统:Linux
- dotnet 6版本:6.0.401
- dotnet 5版本:5.0.408
使用了dotnet-dump
和JetBrains中的dotMemeory
。(dotMemory
不提供对“非托管内存”的任何深入了解)。当前正在研究WinDbg和dotnet-dump命令。
我需要的帮助是
1.如何探测非托管内存并查明问题?
- WinDbg/dotnet-dump分析“非托管内存”的任何有用命令
1.为什么dotnet 6需要如此多的非托管内存,而dotnet 5可以用相对较低的内存占用来完成。
1条答案
按热度按时间kx5bkwkv1#
问题出在Marten,更新版本(v3 -〉v5)在运行时创建类型,因此导致非托管内存出现峰值。Marten团队解释了here行为。按照Marten团队提供的说明操作后,问题解决。