【问题标题】:VS2019 memory profiler - taking snapshot affects memory usage?VS2019 内存分析器 - 拍摄快照会影响内存使用?
【发布时间】:2020-03-20 14:59:52
【问题描述】:

我有一个 WPF 桌面应用程序,它从文件加载一个非常大的序列化对象并对其执行一些数据处理。完成后,用户可以丢弃此数据并加载另一个文件进行处理,依此类推。作为预防措施,由于所创建对象的大小,我在每次“运行”后使用以下命令压缩大对象堆:-

GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();

出于兴趣,我使用GC.GetTotalMemory(false) 在应用程序窗口上显示内存使用情况。加载和处理第一个文件后,内存使用量跃升至 2.2Gb(是的,数据那么大)。如果我随后再次处理同一个文件,内存使用量会跃升至 4.4Gb,这表明之前的数据没有被释放/处置(尽管我 99.99% 确信它应该是)。

不管怎样,这就是奇怪的事情。如果我在“内存使用”模式下使用 VS2019 性能分析器运行应用程序,我可以看到它的图表在第一次处理运行时上升到 2.2Gb,然后在第二次处理时上升到 4.4Gb。 但是,如果我随后拍摄快照,那一刻的内存使用量在分析器图表我的应用程序中显示的值上都会下降到 2.2Gb。

如果我不使用性能分析器(或使用但不拍摄快照),我的应用程序中显示的内存使用量将保持在 4.4Gb 并且永远不会下降。为什么分析器(或更具体地说,拍摄快照)会对内存使用产生影响?

【问题讨论】:

  • 它更有可能对报告内存使用情况产生影响。
  • 功能,不是错误。 Relevant phrase 是“导致 CLR 执行 GC”。快照只能显示根对象,如果没有先收集,您将很难弄清楚该列表中的对象如何匹配内存使用情况。
  • @HansPassant 为什么在我的代码中完成的 GC 没有效果?探查器有何不同之处?
  • 没什么,只是再调用一次 GC.Collect()。我看不到你把它放在哪里,it matters 当你分析调试版本时。

标签: c# visual-studio


【解决方案1】:

内存分析器通常在收集内存快照之前运行垃圾收集器。这可能是你正在观察的。 GC 通常只会在“需要时”运行,尤其是对于运行成本更高的完整收集。

所以观察到的行为并不一定表明有任何问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多