VS 的诊断工具测量的是总进程内存还是当前进程内存

Does VS's Diagnostic Tools measure the total Process Memory or the current Process Memory

Visual Studio 诊断工具是否测量应用程序线程使用的总内存,或当前正在使用的内存?

我有一个应用程序可以每秒 3 帧的速度从 34 兆像素的相机中读取数据。计算得出它每秒处理 288 MB,或每分钟约 17 GB。考虑到这一点,一旦开始收集相机帧,应用程序显然会消耗大量数据。我的眼睛盯着诊断工具有一段时间了,原因如下:

我已经让应用程序 运行 使用性能分析器大约 3 分钟,它最终报告了大约 31 GB 的总进程内存,如下所示:

我的笔记本电脑只有 16 GB 的内存,所以乍一看我认为上面的图片基本上回答了我的问题。然而,刚超过 2:30min 标记,您可以看到内存急剧下降,这是没有意义的(我不相信程序 运行ning 的方式有任何改变)。此外,当我打开任务管理器时,我可以看到我的应用程序使用了大约 9 GB 的内存,然后在 2:30min 标记附近下降到大约 3 GB 的内存。

考虑到所有这些,进程内存真正衡量的是什么?


因为解决方案隐藏在已接受答案的评论中,所以我将在此处总结解决方案,以解决我的程序为何使用如此多内存的总体问题。它与我没有处理位图的错误有关。位图是非托管内存;如果您未能在它们超出范围之前处理它们,它们将继续存在于内存中(在您的垃圾收集器之外),直到达到非托管对象数量的阈值。只有达到该阈值时,非托管对象才会被删除。这就是我的程序中发生的情况,当它从 ~31 GB 内存下降到大约 5 GB 内存时。

However, just past the 2:30min mark you can see a sharp decline in the Memory, which doesn't make sense (I don't believe anything changed in how the program was running).

垃圾收集是一个复杂的过程,它会影响您的应用程序性能。因此 GC 已被优化为仅在内存压力超过阈值时触发。

当存在内存压力时,垃圾收集过程开始并清除不必要的内存分配。这是垃圾收集的正常行为。

Does VS's Diagnostic Tools measure the total Process Memory or the current Process Memory?

它测量应用程序当前的内存使用情况。 Here是了解VS记忆工具的教程

它在垃圾循环后释放大部分内存使用的事实意味着没有大的内存泄漏。

Redgate Ants 内存分析器可以显示更多细节(Retensoin 图等)。这是一段视频,可以清楚地解释内存泄漏。 https://documentation.red-gate.com/amp10/worked-example/video-tutorials

Is it possible to limit the amount of disc space available to a C# program? I'm wondering if I could force C# to hold on to memory for a shorter period of time.

您可以调用 GC.Collect 以强制在占用大量内存的进程后立即进行垃圾回收。但是,除非有充分的理由,否则根本不推荐这样做。垃圾收集使用启发式算法来优化其行为。您通常不必担心这一点。一件事是确保在它们超出范围之前处置所有可处置的实例。这有助于以更少的垃圾周期释放内存。