繁体   English   中英

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

[英]c# windows app - profiling peak memory usage and identifying trends

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

最好的方法是什么?

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

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

寻找关于实现这个的最佳方法的建议,使用什么.net方法,类或者我应该使用外部工具。 这篇文章http://www.itwriting.com/dotnetmem.php建议我应该通过代码来描述我自己的应用程序,以分析.net运行时在盒子上的其他应用程序中使用的共享内存

谢谢

做这件事有很多种方法:

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)。

滚动你自己

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


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

Windows perfmon非常适合这种东西。 您有所有托管堆和专用字节的计数器,如果您需要与迭代计数交叉关联,您可以从.Net 发布自己的 perfmon计数器。

当您想要描述应用程序的内存使用情况时,您可以使用以下代码。 首先,您必须声明PerformanceCounter类的实例

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

每次你想记录你可以调用的内存消耗

_PerfCounter.NextValue()

希望它有所帮助

也许这个工具可以做你想要的一切。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM