我想检查我的服务中的内存泄漏问题。 我已经尝试了以下一组perfmon计数器。
所有堆中的.NET CLR内存#字节数 .NET CLR Memory Gen 2堆大小 .NET CLR内存#GC句柄 .NET CLR内存固定对象数量 .NET CLR内存#总提交字节数 .NET CLR内存#总保留字节数 .NET CLR内存大对象堆大小 我已经从这里提到了上述集合
还提到以下集合:
内存/可用字节 内存/提交字节 进程/专用字节 进程/页面文件字节 进程/处理计数 我已经从这里提到了上述集合
是否有任何参数/标准或任何其他最好的方法来识别内存泄漏的perfmon计数器?
任何人可以建议我设置计数器来检查内存泄漏吗? 或以上集涵盖内存泄漏?
要使用性能监视器检测内存泄漏,请监视这些计数器:
内存/可用字节计数器可让您查看可用内存的总字节数。 该值通常会波动,但如果您的应用程序存在内存泄漏,则会随着时间的推移而减少。 如果发生内存泄漏,Memory / Committed Bytes计数器将稳步上升,因为随着可用内存字节数的减少,提交的字节数会增加。 进程/专用字节计数器显示专门为特定进程保留的字节数。 如果发生内存泄漏,该值将趋于稳定上升。 进程/页面文件字节计数器显示页面文件的大小。 Windows使用虚拟内存(页面文件)来补充机器的物理内存。 随着机器的物理内存开始填满,内存页面将被移至页面文件。 即使在内存充足的机器上也可以使用页面文件,这是很正常的。 但是,如果页面文件的大小稳步增加,这是一个很好的迹象,正在发生内存泄漏。 我也想提一下Process / Handle Count计数器。 应用程序使用句柄来标识他们必须访问的资源。 如果发生内存泄漏,应用程序通常会创建额外的句柄来识别内存资源。 所以处理次数的增加可能表明内存泄漏。 但是,并不是所有的内存泄漏都会导致处理次数的增加。 资源
根据我的经验,这是准确的。
我也会向你推荐微软员工苔丝的微软高级调试博客。 谁建议以下柜台。 我发现上述内容足以说明存在内存泄漏,但我相信苔丝的指示可以提供对问题更深入的了解。
调试演示 - 记忆回顾
所有堆中的.NET CLR内存/#字节数 .NET CLR内存/大对象堆大小 .NET CLR内存/ Gen 2堆大小 .NET CLR内存/ Gen 1堆大小 .NET CLR内存/ Gen 0堆大小 进程/专用字节 进程/虚拟字节
有更好的工具可以使内存泄漏测试变得更简单,例如RedGate ANTS Memory Profiler和JetBrains dotMemory Profiler。
但是,如果您想使用性能计数器,则本文将介绍如何使用性能计数器来测试内存泄漏。
请记住,在某些实例处置后,Garbage Collection不会立即释放内存。 它已经过优化,只有在存在内存压力时才触发和释放内存。 所以,如果你想测试内存泄漏,你应该手动执行垃圾回收,然后再读取计数器读数。
GC.Collect();
GC.WaitForPendingFinalizers();
链接地址:
http://www.djcxy.com/p/80183.html
上一篇:
Perfmon counters to check memory leak
下一篇:
.net memory usage, what determines private byte size