.net内存测量和分析

时间:2011-02-04 02:06:54

标签: c# .net memory profiling

我知道有很多与此相关的问题,所以我会非常具体。 我用两条指令创建Console应用程序。创建具有一些大容量的List并用示例数据填充它,然后清除该List或使其等于null。 我想知道的是,如果有一种方法让我知道/测量/配置文件在调试与否,如果列表被清除后归零的应用程序使用的实际内存大小与列表之前大致相同创建并填充。我确信应用程序已经处理了信息并且GC已经完成了收集,但是我可以确定我的应用程序在此之后将消耗多少内存? 我知道在填充列表的过程中,会分配大量内存,并且在清除之后,如果需要,内存可能可供其他进程使用,但是可以测量应用程序在其中消耗的实际内存。结束? 感谢

编辑:好的,这是我的真实场景和目标。我在WPF应用程序上工作,该应用程序可以处理通过USB设备读取的大量数据。在某些时候,应用程序分配大约700多MB的内存来存储所有List数据,它解析,分析然后写入文件系统。当我将数据写入文件系统时,我清除所有列表并处理以前保存大数据的所有集合,因此我可以进行另一个数据处理。我想知道我不会遇到性能问题或最终耗尽所有内存。我的程序使用了大量的内存,我很好,但是在使用几次USB处理之后我就不能使用它了。 我怎样才能控制住这个?在这种情况下使用内存或进程分析器吗?简单地使用任务管理器,我看到我的应用程序占用了800 MB的内存,但在我清除了收集后,内存保持不变。我知道除非Windows需要它,否则不会失效,所以我想知道我是否可以确定内存已被清除并可以自由使用(通过我的应用程序或窗口)

4 个答案:

答案 0 :(得分:2)

Process Explorer会为您提供所需的所有信息。具体来说,您可能最感兴趣的是您的流程的“私有字节历史”图。

或者,可以使用Window的性能监视器来跟踪您的特定应用程序。这应该给Process Explorer提供相同的信息,尽管它可以让你把实际的数字写到一个单独的文件中。

Process Explorer window

(一张照片,因为我可以...)

答案 1 :(得分:2)

如果你的意思是物理内存,很难衡量Windows上的“实际内存”使用情况。大多数人都想要其他类似的东西:

  1. 为流程分配的内存量(请参阅Zooba的回答)
  2. 分配的托管内存量 - CLR Profiler或此列出的任何其他分析器 - Best .NET memory and performance profiler?
  3. 任务管理器针对您的应用报告的内容
  4. 请注意,在完成垃圾收集后,没有必要为您的进程(1)分配的内存量发生更改 - GC可能会为将来的托管分配保留已分配的内存(此行为不是特定于内存分配的CLR - 大多数内存分配器保留空闲块以供以后使用,除非被迫通过某种方式释放它)。 http://blogs.msdn.com/b/maoni/博客是有关GC /内存详情的绝佳来源。

答案 2 :(得分:1)

我个人使用SciTech Memory Profiler
它有一个实时选项,您可以使用它来查看您的内存使用情况。它帮助我找到了泄漏记忆的许多问题。

答案 3 :(得分:0)

尝试使用ANTS Profiler。它不是免费的,但你可以尝试试用版。


http://www.red-gate.com/products/dotnet-development/ants-performance-profiler/