【问题标题】:Does VS's Diagnostic Tools measure the total Process Memory or the current Process MemoryVS 的诊断工具是测量总进程内存还是当前进程内存
【发布时间】:2020-06-08 12:39:02
【问题描述】:

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

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

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

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

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


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

【问题讨论】:

    标签: c# memory-management memory-leaks garbage-collection visual-studio-2019


    【解决方案1】:

    但是,刚过 2:30 分钟大关时,您可以看到 记忆,没有意义(我不相信任何改变 程序是如何运行的)。

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

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

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

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

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

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

    是否可以限制 C# 可用的磁盘空间量 程序?我想知道我是否可以强制 C# 保留内存一段时间 更短的时间。

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

    【讨论】:

    • 内存使用量是指 RAM 使用量,还是也意味着磁盘空间?
    • @Max: RAM 和虚拟内存(分页)使用率
    • 是否可以限制 C# 程序可用的磁盘空间量?我想知道是否可以强制 C# 在更短的时间内保留内存。
    • @Max:您可以调用 GC.Collect 在内存消耗大的进程之后强制立即进行垃圾回收。但是,除非有充分的理由,否则根本不建议这样做。垃圾收集使用启发式算法来优化其行为。您通常不必担心这一点。一件事是确保您处理所有一次性实例。这有助于以更少的垃圾循环释放内存。
    • @Max: 是的,如果有可丢弃的东西,最好在它们超出范围之前将其丢弃。这有助于更快地释放内存。当您在 ANTS 内存分析器上拍摄快照时,它会执行 GC.Collect。
    猜你喜欢
    • 1970-01-01
    • 2011-01-21
    • 2012-12-02
    • 2021-04-11
    • 2018-03-22
    • 1970-01-01
    • 2013-03-27
    • 2019-06-26
    相关资源
    最近更新 更多