c# - .net 内存测量和分析

标签 c# .net memory profiling

我知道有很多与此相关的问题,所以我会非常具体。 我使用两条指令创建控制台应用程序。创建一个大容量的List并用样本数据填充它,然后清除该List或使其等于null。 我想知道的是,在调试时是否有办法让我知道/测量/分析,如果应用程序在清除列表和清空后使用的实际内存与列表之前大致相同创建和填充。我确定应用程序已处理信息并且 GC 已完成收集,但我能否确定我的应用程序在此之后将消耗多少内存? 我知道在填充列表的过程中,分配了大量内存,并且在清除内存后,如果需要,内存可能可供其他进程使用,但是是否可以测量应用程序消耗的实际内存结尾? 谢谢

编辑:好的,这是我的真实场景和目标。我在处理通过 USB 设备读取的大量数据的 WPF 应用程序。在某些时候,应用程序分配大约 700+ MB 的内存来存储所有列表数据,它解析、分析然后写入文件系统。当我将数据写入文件系统时,我清除了所有的列表并处理了所有以前持有大数据的集合,这样我就可以做另一个数据处理。我想知道我不会遇到性能问题或最终耗尽所有内存。我对我的程序使用大量内存没意见,但我对它在几次 USB 处理后就全部使用它感到不满意。 我怎样才能控制这个?在这种情况下是否使用内存或进程分析器?简单地使用任务管理器,我看到我的应用程序占用了 800 MB 的内存,但在我清除集合后,内存保持不变。我知道除非 Windows 需要它,否则它不会关闭,所以我想知道我是否可以确定内存已清除并且可以免费使用(由我的应用程序或 Windows)

最佳答案

如果您指的是物理内存,则很难衡量 Windows 上的“实际内存”使用情况。您最有可能想要其他类似的东西:

  1. 为进程分配的内存量(参见 Zooba 的回答)
  2. 已分配的托管内存量 - CLR Profiler 或此中列出的任何其他分析器 - Best .NET memory and performance profiler?
  3. 任务管理器为您的应用程序报告的内容

请注意,在垃圾收集完成后,为您的进程分配的内存量 (1) 没有必要更改 - GC 可能会为将来的托管分配保留分配的内存(此行为并非特定于 CLR 的内存分配 - 大多数内存分配器保留空闲 block 供以后使用,除非通过某种方式强制释放它)。 http://blogs.msdn.com/b/maoni/博客是有关 GC/内存的详细信息的极好来源。

关于c# - .net 内存测量和分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4893865/

相关文章:

c# - 什么时候在 C#/.NET 中使用 'object'?

ios - 使用 Photos 框架进行内存管理

c++ - C++非指针数据成员在指针类实例中的分配是在堆上还是在栈上

c++ - PROCESS_MEMORY_COUNTERS_EX 创建不可靠的 PrivateUsage 字段,为什么?

c# - 将信息从 MS Access 数据库传输到 MySQL 数据库

c# - 创建短网址服务时,302 临时重定向是最好的方法吗?

c# - 重试直到用户输入正确

c# - .NET 的通用性能测试框架

c# - 考虑从 Java 迁移到 .NET

c# - 以编程方式更改 Windows 中的自定义鼠标光标?