CLR 性能分析演示






4.55/5 (7投票s)
CLR 分析 ASP.Net 应用程序的步骤
概述
CLR 分析器使您能够查看进程的托管堆,并调查垃圾收集器的行为。使用该工具中的各种视图,您可以获得有关应用程序的执行、分配和内存消耗的有用信息。
使用 CLR 分析器,您可以识别分配过多内存、导致过多垃圾收集以及占用内存时间过长的代码。
CLR 分析器视图
已分配类型直方图、重定位类型直方图、按地址的对象、按年龄的直方图、分配图、程序集、模块、函数和类图、堆图、调用图、时间线、调用树视图。在本文中,我们将讨论已分配类型直方图和按年龄的直方图。
视图 | 描述 |
已分配类型直方图 | 为您提供应用程序生命周期内分配了哪些对象类型(按分配大小)的高级视图。此视图还显示在大对象堆中分配的那些对象(大于 85 KB 的对象)。此视图允许您单击图形的各个部分,以便您可以看到哪些方法分配了哪些对象。 |
按年龄的直方图 | 允许您查看托管堆上对象的生存期。 |
分配图 | 以图形方式显示对象分配方式的调用堆栈。您可以使用此视图来
|
分析 ASP.NET 应用程序所涉及的步骤
- 运行 CLR Profiler.exe
出现以下屏幕确保选中以下复选框
- 正在分析
- 分配
- 调用
- 转到文件菜单。从可用的选项中,选择“分析 ASP.NET”。这将停止 IIS 管理服务,从而停止其他依赖服务(万维网发布服务)。然后重新启动万维网发布服务。然后出现以下屏幕
- 此时,在浏览器中启动应用程序(打开一个新的浏览器窗口)。注意:不要刷新已经打开的应用程序。
- 接下来,出现以下屏幕
浏览您要分析的页面,然后单击“杀死 ASP.NET”。
- 最后,生成以下摘要报告。
通过单击相应的直方图按钮可以查看各种可用选项。
示例分析
示例应用程序的基线分析
分析摘要的快照
单击与“已分配字节”关联的直方图 已分配字节直方图第 1 部分
表示不同对象类型的颜色在窗口的右侧指定。当您滚动浏览这些条时,它会显示对象类型、该对象占用的总内存、创建的总实例数以及实例的平均大小。
已分配字节直方图第 2 部分
正如我们在这里看到的,已经创建了 168,037 个大小 < 64 字节的字符串实例。其中一个主要原因是,当我们连接字符串时,会创建一个具有相同名称的新字符串实例,但旧实例不会被删除。为了改善这种情况,我们可以使用字符串生成器对象而不是字符串。
首先,让我们修改一个用户控件中的一小段代码(即使用字符串生成器而不是字符串)。以下代码片段描述了该更改。代码中的一个属性
/// <summary>
/// Gets the selected text , the items are separated by comma
/// </summary>
public string SelectedText
{
get
{
string selText = string.Empty;
foreach (System.Web.UI.WebControls.ListItem li in DDList.Items )
{
if (li.Selected )
{ selText += li.Text + ","; }
}
if (selText.Length > 0)
selText = selText.Length > 0 ? selTExt.Substring(0,selText.Length-1) : selText;
return selText;
}
set
{ _SelectedText = value;
DDLabel.Text = _SelectedText;
DDLabel.ToolTip = _SelectedText;
}
}
与上述相同的属性,但进行了必要的代码修改。
/// <summary>
/// Gets the selected text , the items are separated by comma
/// </summary>
public StringBuilder SelectedText
{
get
{
StringBuilder selText = new StringBuilder();
foreach (System.Web.UI.WebControls.ListItem li in DDList.Items )
{
if (li.Selected )
{ selText.Append(li.Text).Append(','); }
}
if (selText.Length > 0)
{
String strTemp;
strTemp = selText.ToString();
if (selText.Length > 0)
{
selText.Remove(0, selText.Length);
selText.Append(strTemp.Substring(0, strTemp.Length - 1));
}
}
return selText;
}
set
{ _SelectedText = value;
DDLabel.Text = _SelectedText;
DDLabel.ToolTip = _SelectedText;
}
}
在整个编码过程中更改了两个属性。完成更改后,运行分析器。代码更改后应用程序的分析
分析摘要的快照
从 172,365,764 到 85,497,789,已分配字节部分发生了显着变化。同样,重新定位的字节数已从 32,073,455 减少到 14,284,343。
用“字符串生成器”替换“字符串”是改进内存管理的方法之一。也可以使用其他技术,例如缓存、池、有效的会话处理等。
已分配字节直方图第 1 部分
已分配字节直方图第 2 部分
比较
代码更改之前的总已分配字节数:172,365,764
代码更改后:85,497,789
总已分配字节数的百分比改进:50.397
代码更改之前创建的大小 <64 字节的字符串实例:168,037 (7.1 MB) 平均 44 字节。
代码更改后:52,898 (2.4 MB) 平均 46 字节。
创建的字符串实例(小于 64 字节)的百分比改进:68.52