CLR完全介绍

发现和纠正托管应用程序中的内存问题可能十分困难。 内存问题的表现形式多种多样。例如,您会观 察到,您的应用程序的内存使用量在不断增加,最终导致“内存不足”(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
完全主观番号系列介绍、完全饲养极致剧情介绍、电影完全陌生剧情介绍、自我介绍、介绍信,以便于您获取更多的相关知识。

时间: 2024-10-21 18:57:40

CLR完全介绍的相关文章

CLR 完全介绍: “Orcas”中新增的库类

下一版本的 Microsoft .NET Framework(将随附当前代号为"Orcas"的下一版 Visual Studio 提供)的程序集分为两组,内部称为"red bits"和"green bits".red bits 包括先前在 .NET Framework 2.0 和 3.0 中提供的所有库(例如,mscorlib.dll 和 system.dll).为了确保使 Visual Studio"Orcas"具有高度的向

CLR完全介绍: 托管代码与非托管代码之间的封送处理

让我们面对现实吧.这个世界并不完美.几乎很少有公司在完全用托管代码开发程序,除此之外仍存在很多需要您处理的旧式非托管代码.您怎样将托管和非托管项目集成起来呢?在形式上是采用从托管应用程序调用非托管代码,还是从非托管代码应用程序调用托管代码? 幸运的是,Microsoft .NET Framework 互操作在托管和非托管代码之间开辟了一条通道,而封送处理则在该连接中扮演着非常重要的角色,因为它允许在两者之间进行数据交换(请参见图 1).有很多因素会影响 CLR 在非托管和托管领域之间封送数据的方

CLR 完全介绍: 编写可靠的.NET代码

当我们谈论某样东西具有可靠性时,我们是指它值得信赖,而且可以预测.但是就软件而言,还必须具备其他重要属性,才可以说代码具有可靠性. 软件必须具有复原性,意思是说在出现内部和外部中断情况时,它仍然可以继续正常运行.它必须是可恢复的,以便它知道如何将自己恢复到先前已知的一致状态.软件必须可预测,这样它会提供及时的预期服务.它必须不可中断,意思是更改和升级都不会影响它的服务.最后,软件必须是生产就绪的,意思是它包含最少的 bug,并且只需要进行数量有限的更新.如果满足了这些条件,那么软件就真正称得上可

CLR完全介绍: .NET的内部诊断工具

很多诊断工具都需要使用 CLR 分析 API,甚至包括那些在严格意义上讲不是探查器的工具.因此,如 果您曾经想知道这些工具是如何工作的,那么,了解 API 的分析会是个良好的开端.在本专栏中,您将 看到它们是如何工作的,并了解一些有用的提示和技巧.您还将在"其他分析资源"侧栏内找 到一些基本的资源. 若要使用 CLR 分析 API,需要使用非托管语言(通常是 C++)来创建 DLL,然后设置一些环境变量, 用于指导公共语言运行库 (CLR) 加载 DLL 并允许它使用分析 API.此

CLR完全介绍: 反射之反思

您清晰的组件化目标是否因在库间共享过多类型信息而落空?或许您需要高效的强类型化数据存储,但如果每次对象模型发展后都需要更新您的数据库架构,那会耗费很大成本,所以您更愿意在运行时推断出其类型架构吗?您需要交付能接受任意用户对象的组件,并以某种智能化的方式处理它们吗?您希望库的调方者能以编程方式向您说明它们的类型吗? 如果您发现自己在苦苦维持强类型化数据结构的同时,又冀望于最大化运行时灵活性,那么您大概会愿意考虑反射,以及它如何改善您的软件.在本专栏中,我将探讨 Microsoft .NET Fra

在SQL Server 2005中创建CLR存储过程的详细介绍

在2005之前的版本创建存储过程都是在数据库里面写Transact-SQL语言实现的,不过现在SQL Server 2005支持用其他面向对象的语言编写CLR存储过程了,关于这样做的好处,官方有很多解释了,这里就直接说明实现方法了. 假设服务器里面有个test数据库,数据库有个架构user,还有一个表test1,然后有个sql登陆用户叫test_user,将这个用户设置成VS2005里面数据库连接的登陆用户. 在VS2005中创建一个项目,类别是SQL Server数据库项目,然后往项目里面添加

在SQL Server 2005中创建CLR存储过程的详细介绍_MsSql

在2005之前的版本创建存储过程都是在数据库里面写Transact-SQL语言实现的,不过现在SQL Server 2005支持用其他面向对象的语言编写CLR存储过程了,关于这样做的好处,官方有很多解释了,这里就直接说明实现方法了. 假设服务器里面有个test数据库,数据库有个架构user,还有一个表test1,然后有个sql登陆用户叫test_user,将这个用户设置成VS2005里面数据库连接的登陆用户. 在VS2005中创建一个项目,类别是SQL Server数据库项目,然后往项目里面添加

CLR全面透彻解析: .NET应用程序可扩展性

借助 Microsoft .NET Framework,编程人员便可轻松获取由不同开发人员和公司构建的组件,并将这 些组件集成到自己的应用程序中.但仅当已知哪些组件是构建基础时才能轻松实现上述过程.如果在构建 时对所需组件一无所知(对于加载项,通常会遇到这种情况),那么事情就会变得更加困难.开发人员在 扩展其应用程序时经常会遇到问题.例如,应将加载项存储在数据库中还是磁盘上?开发人员应考虑已知 接口的加载项以获得激活类型吗?使用 AppDomain.AppDomainManager 和 AppD

使用 SQL Server 2005中的 CLR 集成

本文描述了数据库应用程序开发人员和架构师如何利用 SQL Server 2005 中的 CLR 集成功能.本文对基于 CLR 的编程方式与 SQL Server 中支持的现有编程模型(如 TransacT-SQL 和扩展存储过程)进行了比较,并且强调了各自相对的优缺点.还提供了一组选择合适的编程替代方法的高级指导,以及一些示例和代码示例. 一.简介 Microsoft 通过宿主 Microsoft .NET Framework 2.0 公共语言运行库 (CLR),SQL Server 2005显