【发布时间】:2021-06-19 06:47:11
【问题描述】:
我目前正在为 Zenon Runtime 创建插件。它们是用 C# 编写的,然后被添加到运行时。
当我在没有插件的情况下运行运行时时,RAM 使用量始终保持在 30-100MB 左右。一旦我添加了插件,它就会非常缓慢地上升,直到运行时开始挂起并变得无响应,并且使用了大约 2 gig 的内存。
我现在正试图弄清楚这是否真的是我这边的内存泄漏,或者它是由 Zenon 应用程序引起的。
我已经创建了转储文件和 VMMap,还远程调试了插件。结果是:
远程调试:内存使用量约为 5MB(也许 Visual Studio 无法真正跟踪另一个运行时内的插件的内存?)
使用windbg 分析的转储文件:绝对没有使用内存。同样在最大 5-50MB 左右,非托管内存达到 800MB。
VMMap:堆为 75MB,映像为 300MB,托管堆为 60MB,映射文件为 50MB,但私有数据为 830MB
所以我的猜测是:私人数据是它被填满的主要原因。
我现在的问题:.NET 应用程序会导致私有数据/非托管内存填满吗?
无论如何我如何才能进行更详细的分析?
是的,我知道这是一个大问题,没有太多要展示的内容,但也许你可以帮助我确定我可以采取哪些步骤来确定问题......我现在很无能为力。
【问题讨论】:
-
使用内存分析器查找堆积的对象。如果您要注册活动,请务必取消注册。
-
谢谢!我也不会在转储文件中看到这些对象吗? Visualstudio 诊断工具是否足以做到这一点?
-
我不知道如何读取转储文件,但我想是的,如果你知道你在做什么,你会看到它。 VS 诊断工具可能就足够了,它可以让您查看堆并拍摄快照
-
谢谢。我目前正在使用 jetbrains mem 工具监控内存。现在它显示使用了 9MB .NET 和总共 160MB,我每隔几个小时拍摄一次快照以查看变化...
-
这里完全是倾斜的评论,但有时第 3 方库可能完全不可救药。在这些情况下,您可以将它们包装在自己的 AppDomain 中,并根据需要创建/销毁该 AppDomain。 GL!
标签: c# .net memory memory-leaks