c #windows app - 分析峰值内存使用情况并识别趋势

时间:2009-07-08 11:50:42

标签: c# memory profiling

我有一个长期运行的控制台应用程序,运行数百万次迭代。如果随着迭代次数的增加,内存使用量会增加,我想进行基准测试。

最好的方法是什么?

我认为在运行期间我真的只需要关注峰值内存使用吗?我基本上需要弄清楚在服务器上有内存的情况下,我可以在这个硬件上运行的最大迭代次数。

我将设置批量运行并将结果记录到不同的交互大小,然后将结果绘制成识别内存使用趋势,然后可以针对任何给定的硬件进行外推。 / p>

寻找有关实现此目的的最佳方法的建议,使用什么.net方法,要使用的类,还是应该使用外部工具。本文http://www.itwriting.com/dotnetmem.php建议我应该通过代码将我自己的应用程序配置为将.net运行时使用的共享内存分解到其他应用程序上。

由于

5 个答案:

答案 0 :(得分:6)

有几种方法可以做到这一点:

Perfmon UI

您可以使用Windows附带的Performance Montior控制面板小程序(在“管理工具”中)来监控您的应用程序。看看.Net CLR Memory类别及其中的计数器。您还可以将监控限制为仅适用于您的流程。这可能是最简单的,因为它不需要更改代码。

Perfmon API

您可以通过编程方式使用.Net中的性能计数器。为此,您需要使用PerformanceCounter类。这只是上述UI提供的相同底层信息的API。

Memory Profiler

您可以使用内存分析器在应用程序运行时对其进行分析。我成功使用的两个是来自RedGate的ANTS Memory Profiler和来自SciTech的.Net Memory Profiler。同样,这不需要更改代码,但可能会花钱(尽管有免费试用版)。还有CLR Profiler(可以找到一个howto here)。

自己动手

您可以从Process课程中获取一些有限的内存信息。使用Process.GetCurrentProcess()获取当前流程,然后查看其属性,特别是与内存相关的属性(MinWorkingSetMaxWorkingSetPagedMemorySize64,{{3 }},PeakPagedMemorySize64PeakVirtualMemorySize64PeakWorkingSet64PrivateMemorySize64VirtualMemorySize64)。这可能是最糟糕的解决方案,因为您必须自己完成所有事情,包括数据收集和报告。


如果您想要做的就是验证您的应用程序在迭代次数增加时不会线性增加其内存使用量,我建议您使用Windows中的性能监视器UI进行监视。它会以最小的努力向您展示您的需求。

答案 1 :(得分:3)

Windows perfmon非常适合这种事情。你有所有托管堆和私有字节的计数器,如果你需要与迭代计数交叉关联,你可以{。3}}来自.Net的perfmon计数器。

答案 2 :(得分:1)

如果您想要分析应用的内存使用情况,可以使用以下代码。 首先,您必须声明PerformanceCounter类的实例

Assembly a = Assembly.GetExecutingAssembly();
_PerfCounter = new PerformanceCounter(".NET CLR Memory",
                                      "# Bytes in all Heaps",
                                      a.GetName().Name,
                                      true);

每次要记录内存消耗时都可以调用

_PerfCounter.NextValue()

希望它有用

答案 3 :(得分:0)

也许this tool可以做你想做的一切。

答案 4 :(得分:0)

迟到总比没有好,但是为了回应M3ntat的评论,如果你在Visual Studio中运行,你需要在程序集名称参数中添加“.vshost”,例如

a.GetName().Name + ".vshost"