内存分析一直是个比较令人头痛的问题,Visual Studio 2013中就集成了一个内存分析的功能,可以方便我们进行分析内存的占用情况。本文将简单的介绍一下如何使用这个功能。

首先以一个简单的程序为例:

class MyObj
    {
        byte[] data;

public MyObj()
        {
            data = new
byte[10240];
        }
    }

static
void Main(string[] args)
    {
        var buffer = new
List<MyObj>();

for (int i = 0; i < 1000; i++)
        {
            buffer.Add(new
MyObj());
        }

Console.ReadLine();
    }

这个程序比较简单,启动的时候申请1000个MyObj对象,每个对象占用10k内存,一共占用10m。

要分析这个程序的内存占用,首先我们需要将其内存dump出来,这里推荐用ProcDump,可以在微软的网站上下载。使用方式如下:

procdump.exe -ma
ConsoleApplication1.exe
test.dmp

通过这个命令,就可以将进程当前的内存情况dump出来,生成一个名为test.dmp的dump文件。然后,我们就可以用Visual Studio 2013直接打开这个dump文件了。

点击右侧的"调试托管内"存按钮开始分析内存,便可以非常清晰的看到内存的占用分布。

另外,它还有一个非常贴心的功能,可以比较两个dump文件的内存差异:

总体感觉这个功能还是非常好用的,限于篇幅,这里就不做更多的介绍了,要更深入的学习这个功能的话可以看看这篇文章Using Visual Studio 2013 to Diagnose .NET Memory Issues in Production

不过,有一个问题是,这个功能集成在VisualStudio中了,如果要分析现场遇到的问题时,可能现场的机器中是没有VisualStudio的,需要把dump文件发送会来分析,但很多时候现场的是没有通互联网,或者是一个带宽较窄的专线的,dump文件又显得过大而传输不便,如果能把这个功能独立出来就好了。

好在微软也发布了一个名为ClrMD 单独的库可以分析进程和dump文件的内存占用,通过它我们可以写一个分析程序:

var stats = from o in heap.EnumerateObjects()
                let t = heap.GetObjectType(o)
                group o by t into g
                let size = g.Sum(o => (uint)g.Key.GetSize(o))
                orderby size
                select
new
                {
                    Name = g.Key.Name,
                    Size = size,
                    Count = g.Count()
                };

foreach (var item in stats)
        Console.WriteLine("{0,12:n0} {1,12:n0} {2}", item.Size, item.Count, item.Name);

不过,这个库还在开发阶段,我使用了一下,老报错,也没有找到原因。这里就不做过多介绍了,等正式版发布后再单独写篇文章体验下。感兴趣的朋友可以看看这篇文章

体验VisualStudio 2013中的内存分析功能的更多相关文章

  1. Opencv2.4.9安装和在visualstudio 2013中配置

    Opencv2.4.9安装和在visualstudio 2013中配置 下载opencv和在windows下安装: 最新版本号的opencv是2014.4.25的opencv2.4.9,这里选择当前最 ...

  2. 删除VisualStudio 2013中的 "send Feedback" 按钮

    在VisualStudio 2013中,在标题栏中增加了一个 "send Feedback" 按钮,用于给微软发送Bug和回馈(或者一个哭脸和笑脸).这个按钮对于开发来说基本上没用 ...

  3. Java 程序运行过程中的内存分析

    作为 java 程序员,都应该知道 Java 程序运行在 JVM(Java Virtual Machine,Java 虚拟机)上,可以把 JVM 理解成 Java 程序和操作系统之间的桥梁,JVM 实 ...

  4. 使用dotTrace6.0进行内存分析

    dotTrace6.0提供了内存分析功能,统计抓取的时间段内各个堆栈执行过程中使用的内存大小,按照堆栈执行情况树状排序:和它之前提供的时间统计类似,粗截了几个页面,希望对大家有所帮助. 下载安装Jet ...

  5. visual studio 2013 中配置OpenCV2.4.13 姿势

    首先在path中添加 “C:\OpenCV\opencv\build\x64\vc12\bin”   (地址随实际变化) 注:添加的都是*86不使用*64 在visualstudio 2013中配置 ...

  6. java执行程序的内存分析系列专栏

    近段时间研究了java的程序执行过程中的内存分配,收获颇多,解决了我最近时间学习java的很多困惑点.写java内存分析系列的目的主要有两个,一来是希望给像我一样的java初学者一定的启发,希望也能解 ...

  7. VisualStudio 2013 Prieview体验

    今天看到VisualStudio 2013的预览版发布了,便立即下载试用了一下. 主体界面和VS2012非常类似,不过色彩要稍微丰富点. 现在支持用MS账户登录了,登陆后可以同步设置,这个小功能还是比 ...

  8. c中的进制与内存分析

    一. 进制 1. 什么是进制 l 是一种计数的方式,数值的表示形式 数一下方块的个数 汉字:十一   十进制:11  二进制:1011  八进制:13 l 多种进制:十进制.二进制.八进制.十六进制. ...

  9. 在Eclipse中使用MAT分析Android程序内存使用状况(转)

    对于Android这种手持设备来说,通常不会带有太大的内存,而且一般用户都是长时间不重启手机,所以编写程序的时候必须要非常小心的使用内存,尽量避免有内存泄露的问题出现.通常分析程序中潜在内存泄露的问题 ...

随机推荐

  1. PHP如何实现第三方分享

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. rtmp jwplayer简单应用

    在nginx下使用,放到nginx/html文件夹内,之后访问 首先是播放vod视频 <!DOCTYPE html> <html xmlns="http://www.w3. ...

  3. 爬虫python

    最近看到电影,也看了很多的评论,想了解下大多人对相关电影的评论,正好也在学习Python,就利用其爬虫的强大能力,这里利用Python3.6.1 下面是相关代码: #coding:utf-8 __au ...

  4. 决策树与随机森林Adaboost算法

    一. 决策树 决策树(Decision Tree)及其变种是另一类将输入空间分成不同的区域,每个区域有独立参数的算法.决策树分类算法是一种基于实例的归纳学习方法,它能从给定的无序的训练样本中,提炼出树 ...

  5. POJ2417 Discrete Logging | A,C互质的bsgs算法

    题目: 给出A,B,C 求最小的x使得Ax=B  (mod C) 题解: bsgs算法的模板题 bsgs 全称:Baby-step giant-step 把这种问题的规模降低到了sqrt(n)级别 首 ...

  6. 让JS帮你决定午餐吃什么吧

    最愁就是每天中午吃什么了,有空就做了个 JavaScript 轮播随机选择.会轮播预先自定义的菜单中,然后点选定的时候确定一款.代码可以查看本页源代码获得,你可以自定义修改菜单数组. 效果演示 准备选 ...

  7. 论文笔记《Hand Gesture Recognition with 3D Convolutional Neural Networks》

    一.概述 Nvidia提出的一种基于3DCNN的动态手势识别的方法,主要亮点是提出了一个novel的data augmentation的方法,以及LRN和HRn两个CNN网络结合的方式. 3D的CNN ...

  8. ABC103

    Wow今天听同学说了这个网站,做了一次比赛的题目,只有四道题. A.三个数a,b,c,找两个最小的差相加,显然是中间数与另外两个数的差,也就是最大值减最小值了 B.两个字符串,判断能否通过对一个进行每 ...

  9. Gradle for Android(二)全局设置、自定义BuildConfig

    全局设置 如果有很多项目,可以设置全局来统一管理版本号或依赖库,根目录下build.gradle下: ext { compileSdkVersion = 23 buildToolsVersion = ...

  10. 原生dialog

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...