PerfView 概述:

PerfView是一个可以帮助你分析CPU和内存问题的工具软件。它非常轻量级也不会入侵诊断的程序,在诊断过程中对诊断的程序影响甚微。

Visual Studio自带的性能分析功能在CPU占用、时间消耗、内存分配等方面的诊断效果还算不错,但PerfView可以提供更加丰富的诊断分析信息。

在这篇文章中,我将使用PerfView给你展现如下功能:

  • GC回收发生的频率以及回收所消耗的时间;
  • 获取导致Large object分配的原因;
  • 内存被谁占用了;
  • 对比哪个托管对象增大的最快。

测试程序

现在我们准备一个将会导致内存泄露的程序,用来确保使用PerfView可以达到我们所期望的效果。它是一个WinForm应用程序,后台代码如下:、

    public partial class Form1 : Form
{
private List<int[]> arrays = new List<int[]>();
Random random = new Random(); public Form1()
{
InitializeComponent(); Thread thread = new Thread(Start);
thread.IsBackground = true;
thread.Start();
} private void Start(object obj)
{
while (true)
{
int[] a = new int[random.Next(90000, 100000)];
arrays.Add(a);
Thread.Sleep(10);
}
}
}

使用PerfView进行跟踪

开启PerfView,你将会看到如下窗口:

PerfView的使用手册被集成在这个程序中,你可以菜单栏来进行访问。

然后点击菜单“Collect-->Collect”来进行数据采集,用来分析生成诊断结果:

无需修改任何初始化配置,点击“Start Collection”按钮,PerfView将会开始采集所有进程的事件数据。

数十秒之后,你可以点击“Stop Collection”按钮,PerfView将会停止采集并生成诊断文件“PerfViewData.etl.zip”:

获取GC Stats

双击“GCStats”报表,将会弹出一个窗口,窗口中显示了每一个进程GC信息,找到我们的测试程序。

关于测试程序我们将会得到如下汇总信息表:

进一步往下看,还会显示GC触发的原因:

如上图所示,这次GC的collection的发生是因为large object的分配。

获取导致large object分配的原因

从PerfView的主界面,双击打开“GC Heap Alloc Stacks”窗口,然后双击测试程序的进程,之后弹出的窗口将根据内存分配从大到小的次序显示堆栈信息:

PerfView会将所有的large object分配都归类在LargeObject节点下面,双击该节点可以看到如下信息:

备注:如果你在上图所示的界面中看到“OTHER<<clr?>>”,可以对其鼠标右击,然后点击“Lookup Symbols”,来获取CLR和Windows的功能名称。

上图中主要列的说明如下:

Inc%:表示该对象分配的字节占所有记录分配的百分比;

Inc:该对象分配字节的总数;

Inc Ct:该对象分配的次数。

从上图可以看出,巨多的large object都是来自Start方法的Int32数组,PerView精确地诊断出我们预期的效果。

谁造成了内存泄露

PerfView可以通过heap dump来查看占用内存的对象的路径。

从主界面点击菜单项“Memory-->Tale Heap Snapshot”,弹出窗口如下图所示:

找到我们的测试程序并选中,然后点击“Dump GC Heap”按钮,数秒后再点击“CLose”按钮,最后会生成一个“.gcdump”文件。

双击打开“WindowsFormsApplication1.gcdump”窗口,显示如下所示:

PrefView精确地诊断出,是static variables占用了内存。

使用两个Heap Dump来查看对象所占内存的变化情况

在应用程序连续运行的情况下,对其进行两次Take Heap Sanpshot,确保两次生成的文件名称不一致。同时打开这两个.gcdump文件的窗口,通过任一一个窗口的diff菜单项功能,都能以另一个窗口的数据为基准进行对比。

Perfview 分析进程性能的更多相关文章

  1. google perftools分析程序性能

    Google perftools 1.功能简介 它的主要功能就是通过采样的方式,给程序中cpu的使用情况进行“画像”,通过它所输出的结果,我们可以对程序中各个函数(得到函数之间的调用关系)耗时情况一目 ...

  2. Centos6下通过 oprofile分析CPU性能

    Centos6下通过 oprofile分析CPU性能 2014-01-18 10:55:15 bobpen 阅读数 2218更多 分类专栏: linux   版权声明:本文为博主原创文章,遵循CC 4 ...

  3. Linux 使用iostat分析IO性能

    原文:http://www.cnblogs.com/bangerlee/articles/2547161.html 对于I/O-bond类型的进程,我们经常用iostat工具查看进程IO请求下发的数量 ...

  4. 使用show profiles分析SQL性能

    如何查看执行SQL的耗时 使用show profiles分析sql性能. Show profiles是5.0.37之后添加的,要想使用此功能,要确保版本在5.0.37之后. 查看数据库版本 mysql ...

  5. 使用iostat分析IO性能

    对于I/O-bond类型的进程,我们经常用iostat工具查看进程IO请求下发的数量.系统处理IO请求的耗时,进而分析进程与操作系统的交互过程中IO方面是否存在瓶颈. 下面通过iostat命令使用实例 ...

  6. 【MS SQL】通过执行计划来分析SQL性能

    原文:[MS SQL]通过执行计划来分析SQL性能 如何知道一句SQL语句的执行效率呢,只知道下面3种: 1.通过SQL语句执行时磁盘的活动量(IO)信息来分析:SET STATISTICS IO O ...

  7. 用 CPI 火焰图分析 Linux 性能问题

    https://yq.aliyun.com/articles/465499 用 CPI 火焰图分析 Linux 性能问题   yangoliver 2018-02-11 16:05:53 浏览1076 ...

  8. 【PHP】善用php-fpm的慢执行日志slow log,分析php性能问题

    (转)善用php-fpm的慢执行日志slow log,分析php性能问题  众所周知,mysql有slow query log,根据慢查询日志,我们可以知道那些sql语句有性能问题.作为mysql的好 ...

  9. 大数据学习--day14(String--StringBuffer--StringBuilder 源码分析、性能比较)

    String--StringBuffer--StringBuilder 源码分析.性能比较 站在优秀博客的肩上看问题:https://www.cnblogs.com/dolphin0520/p/377 ...

随机推荐

  1. 5G-第五代移动通信系统(5th generation mobile/wireless/cellular system)

    通信系统 有意义的信息交流被称为通讯. 自然界:狼嚎.狗叫.虫鸣.鸡叫. 人类社会:说话.眼神.写信.烽火台. 目的:信息的传递. 人类发明电以后,开始使用电来传递信息,特别快. 于是有了电报.电话以 ...

  2. was 发布版本的步骤:

    was 发布版本的步骤:实际使用:1.备份应用 (备份应用下的war包,tar -czvf app.20200418.tar.gz app.war)2.停服务(was 控制台停,方便)3.替换该版本文 ...

  3. 给定 n 个字符串,求有多少字符串是其他字符串的前缀。

    1 #include <cstdio> 2 #include <set> 3 #include <iostream> 4 #include <cstring& ...

  4. Raft协议备注

    Raft协议 Raft协议基于日志实现了一致性 实现备份的是机制:复制状态机Replicated State Machine,如果两个相同的.确定性的状态机从同一状态开始,以相同顺序输入相同的日志,则 ...

  5. Linux常用命令合集(一)

    1.处理目录的常用命令: ls(英文全拼:list files): 列出目录及文件名 cd(英文全拼:change directory):切换目录 pwd(英文全拼:print work direct ...

  6. Kubernetes Controller详解

    运行容器化应用是Kubernetes最重要的核心功能.为满足不同的业务需要,Kubernetes提供了多种Controller,主要包括Deployment.DaemonSet.Job.CronJob ...

  7. net core webapi多版本控制与nswag 交互

    前言 首先希望webapi 支持多版本,swagger针对不同的版本可进行交互.netcore 基于Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer 包, ...

  8. Reverse for ‘password_reset_complete‘ not found. ‘password_reset_complete‘ is not a valid view funct

    关注公众号"轻松学编程"了解更多 原因 在使用xadmin与django 2版本以上修改密码时会报这个错,这是由于django修改密码成功后使用的是success_url参数,而x ...

  9. Mybatis的dao层实现 接口代理方式实现规范+plugins-PageHelper

    Mybatis的dao层实现 接口代理方式实现规范 Mapper接口实现时的相关规范: Mapper接口开发只需要程序员编写Mapper接口而不用具体实现其代码(相当于我们写的Imp实现类) Mapp ...

  10. 浅谈 Johnson 算法

    目录 前言 引入 算法概述 算法流程 正确性证明 代码实现 结语 前言 Johnson 和 Floyd 一样是用来解决无负环图上的全源最短路. 在稀疏图上的表现远远超过 Floyd,时间复杂度 \(O ...