发现和纠正托管应用程序中的内存问题可能十分困难。 内存问题的表现形式多种多样。例如,您会观 察到,您的应用程序的内存使用量在不断增加,最终导致“内存不足”(OOM) 异常(您的应用 程序甚至可能在有大量可用物理内存的情况下引发内存不足异常)。但以下任何一种情况均表明内存可能 出现了问题:
引发 OutOfMemoryException(内存不足异常)。
进程占用了太多内存,您无法确定任何明显 的原因。
似乎垃圾收集功能并没有快速清理对象。
托管堆碎片过多。
应用程序过 度占用 CPU。
此专栏讨论研究过程,并向您展示如何收集您所需的数据,以确定您所面临的应用 程序中的内存问题的类型。此专栏并不包括如何实际修复您所发现的问题,但可以为您提供对问题根源的 深入分析。
我们首先简要介绍一下可用于研究托管内存问题的最实用的性能计数器。然后我们会 介绍研究过程中常用的工具,接着介绍一系列常见的托管内存问题以及如何研究这些问题。
但在 开始之前,您首先应熟悉一些基本概念:
Microsoft .NET Framework 中的垃圾收集。有关 详细信息,请参阅以下两个博客记录:blogs.msdn.com/156626.aspx 和 blogs.msdn.com/234273.aspx.
Windows 中的虚拟内存的工作原理。这包括保留内存和分配 内存的概念。
使用 Windows 调试程序(WinDbg 和 CDB)。
使用的工具
在开始之 前,我们应该花点时间讨论一下在诊断与内存相关的问题时通常使用的一些工具。
性能计数器 通 常,您会希望首先了解性能计数器。通过这些计数器,您可以收集必要的数据以确定出现问题的准确位置 。虽然有些其他工具也值得关注,但是最有用的性能计数器是 .NET Framework 上介绍的性能计数器。
调试程序 在这里我们将使用 WinDbg,该工具随 Windows 调试工具提供。SOS.dll 中提供的 Son of Strike 扩展 (SOS),用于调试 WinDbg 中的托管代码。在启动了调试程序并将其附加到托管进程(或 加载故障转储)后,您可以通过键入以下代码加载 SOS.dll:
.loadby sos mscorwks
如 果您正在调试的应用程序使用的是不同版本的 mscorwks.dll,则该命令无法执行,那么应找到该应用程 序使用的 mscorwks.dll 版本的 SOS.dll,然后运行以下命令:
.load <path_to_sos>\sos.dll
SOS.dll 随 .NET Framework 安装在 %windir%\microsoft.net\framework\<.NET 版本>目录下。 SOS.dll 扩展提供了大量用于检查托管堆的有用命令。有关所有这些命令的文档,请参阅 SOS 调试扩展 (SOS.dll)。
Windows 任务管理器 Taskmgr.exe 可方便地发现超出预期的内存使用情况,并可检查在一段时间内一 些简单的进程指标的趋势。注意,taskmgr 中有两个经常被误解的指标:Mem Usage (内存使用)和 VM Size(虚拟内存大小)。Mem Usage 表示的是进程工作集(就像进程\工作集性能计数器)。它并不表示 所使用的字节数。VM Size 反映的是供进程使用的字节数(就像进程\专用字节数性能计数器)。VM Size 可提供关于您是否面临内存泄漏问题(如果您的应用程序存在泄漏,则 VM Size 会随时间增加)第一线 索。
内存转储 在此专栏中介绍的大多数研究技巧都依赖于内存转储。使用调试程序的方法有两种 — 您可以将其附加到正在运行的进程,或利用它来分析故障转储。第一种方法提供了直接的视图,使您可以 了解应用程序在运行时的状况,但该技巧并不总是可行的。
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索内存
, 问题
, 性能
, 进程
, 应用程序
, 计数器
, sos
进程调试windbg
完全主观番号系列介绍、完全饲养极致剧情介绍、电影完全陌生剧情介绍、自我介绍、介绍信,以便于您获取更多的相关知识。