c# windows 应用程序 - 分析峰值内存使用情况并确定趋势

标签 c# memory profiling

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

解决此问题的最佳方法是什么?

我认为我真的只需要关心运行期间的峰值内存使用量,对吧?我基本上需要计算出在给定服务器内存的情况下我可以在此硬件上运行的最大迭代次数。

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

寻求有关实现此功能的最佳方法的建议,要使用哪些 .net 方法、类,或者我应该使用外部工具。本文http://www.itwriting.com/dotnetmem.php建议我应该通过代码分析我自己的应用程序,以分解出 .net 运行时使用的共享内存与盒子上的其他应用程序。

谢谢

最佳答案

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

性能监视器界面

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

性能监视器 API

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

内存分析器

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

自己动手

您可以从 Process 类中获取一些有限的内存信息。使用Process.GetCurrentProcess()获取当前过程,然后查看其属性,特别是与内存有关的属性(MinWorkingSetMaxWorkingSetPagedMemorySize64PeakPagedMemorySize64PeakVirtualMemorySize64PeakWorkingSet64PrivateMemorySize64,0x101161101611016716,10116,10110411041104104,00044,0004.679,000,4,0X104,000 ,,这可能是最糟糕的解决方案,因为您必须自己做所有事情,包括数据收集和报告。


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

关于c# windows 应用程序 - 分析峰值内存使用情况并确定趋势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1097589/

相关文章:

c# - Unity 3d v2019.4.2f1 VSCode 自动补全不起作用

c# - 列出 WCF 服务中的数据成员

c# - OpenFileDialog 在超过 260 个字符的路径上返回空字符串(或根本不返回)

c# - 如何让抽象方法返回具有具体实现的抽象类型?

c - C中的文件内存泄漏

php - 如何使用 xdebug 只调试一个虚拟主机?

c++ - 如何从内存中读取第三方应用程序的变量?

c++ - 不修改变量时按引用传递的作用是什么?

xcode - 我如何阅读仪器?

c# - 网络不适用于 Visual Studio 2015 的控制台应用程序