zoukankan      html  css  js  c++  java
  • 体验VisualStudio 2013中的内存分析功能

    内存分析一直是个比较令人头痛的问题,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);

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

  • 相关阅读:
    scrapy下载图片第一波
    scrapy之防ban策略
    xml之dtd约束
    Java jdbc相关
    XSS获取cookie
    反射型XSS & DVWA
    MySQL数据库设计规范
    SQL Server 查询指定时间是一年当中的第几周
    js验证15位或18位身份证
    C# Process.Start()
  • 原文地址:https://www.cnblogs.com/TianFang/p/3351527.html
Copyright © 2011-2022 走看看