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. volatile与重排序

    使用关键字volatile可以禁止代码的重排序: 在Java程序运行时,JIT(即使编译器)可以动态地改变程序代码运行地顺序:例如,有如下代码: A代码-重耗时 B代码-轻耗时 C代码-重耗时 D代码 ...

  2. 【洛谷】 cpp-->c 一道好玩的显示题

    P1538 这题真的好玩 题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同 ...

  3. Hive LLAP

    body { margin: 0 auto; font: 13px / 1 Helvetica, Arial, sans-serif; color: rgba(68, 68, 68, 1); padd ...

  4. openspiel 随笔 05.05

    现阶段的任务是向openspiel 中添加e一个自己的游戏 上次已经将大体的逻辑写完了,但运行时出了问题.state 为空. Incorrect number of characters in str ...

  5. Swagger配置与使用

    问题:前后端分离时代的到来 前端需要测试后端数据 后端提供接口,实时更新接口的改动 一.Swagger简介 号称世界上最流行的api框架 Restful api文档在线自动生成工具-->api文 ...

  6. WIN32之消息队列

    0x01. 什么是消息? 当我们点击鼠标的时候,或者当我们按下键盘的时候,操作系统都要把这些动作记录下来,存储到结构体中,这个结构体就是 消息 比如我们点击运行程序,是通过消息队列获取,通过explo ...

  7. Spring Cloud 学习笔记 (一)-- Eureka 服务器

    开局一张图,截取了本人学习资料中的一张图,很好地展示了Eureka的架构. Eureka服务器 管理服务的作用.细分为服务注册,服务发现. 所有的客户端在Eureka服务器上注册服务,再从Eureka ...

  8. 解放双手,不写SQL!一个开源mybatis神器

    什么是通用 Mapper? 它是一个可以方便的使用 Mybatis 进行单表的增删改查优秀开源产品.它使用拦截器来实现具体的执行 Sql,完全使用原生的 Mybatis 进行操作.在 Github 上 ...

  9. debian 安裝SSH 增加新用戶 并使用sudo

    1 新建新用戶user 2 3 adduser user 4 5 passwd 123654 6 7 exit 刚安装好的Debian默认还没有sudo功能. 1.安装sudo # apt-get i ...

  10. Nginx四层转发vsftp

    1.需要安装stream模块2.在nginx.conf默认配置文件添加如下配置即可stream { log_format tcp '$remote_addr [$time_local] ' '$pro ...