体验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);
不过,这个库还在开发阶段,我使用了一下,老报错,也没有找到原因。这里就不做过多介绍了,等正式版发布后再单独写篇文章体验下。感兴趣的朋友可以看看这篇文章。
体验VisualStudio 2013中的内存分析功能的更多相关文章
- Opencv2.4.9安装和在visualstudio 2013中配置
Opencv2.4.9安装和在visualstudio 2013中配置 下载opencv和在windows下安装: 最新版本号的opencv是2014.4.25的opencv2.4.9,这里选择当前最 ...
- 删除VisualStudio 2013中的 "send Feedback" 按钮
在VisualStudio 2013中,在标题栏中增加了一个 "send Feedback" 按钮,用于给微软发送Bug和回馈(或者一个哭脸和笑脸).这个按钮对于开发来说基本上没用 ...
- Java 程序运行过程中的内存分析
作为 java 程序员,都应该知道 Java 程序运行在 JVM(Java Virtual Machine,Java 虚拟机)上,可以把 JVM 理解成 Java 程序和操作系统之间的桥梁,JVM 实 ...
- 使用dotTrace6.0进行内存分析
dotTrace6.0提供了内存分析功能,统计抓取的时间段内各个堆栈执行过程中使用的内存大小,按照堆栈执行情况树状排序:和它之前提供的时间统计类似,粗截了几个页面,希望对大家有所帮助. 下载安装Jet ...
- visual studio 2013 中配置OpenCV2.4.13 姿势
首先在path中添加 “C:\OpenCV\opencv\build\x64\vc12\bin” (地址随实际变化) 注:添加的都是*86不使用*64 在visualstudio 2013中配置 ...
- java执行程序的内存分析系列专栏
近段时间研究了java的程序执行过程中的内存分配,收获颇多,解决了我最近时间学习java的很多困惑点.写java内存分析系列的目的主要有两个,一来是希望给像我一样的java初学者一定的启发,希望也能解 ...
- VisualStudio 2013 Prieview体验
今天看到VisualStudio 2013的预览版发布了,便立即下载试用了一下. 主体界面和VS2012非常类似,不过色彩要稍微丰富点. 现在支持用MS账户登录了,登陆后可以同步设置,这个小功能还是比 ...
- c中的进制与内存分析
一. 进制 1. 什么是进制 l 是一种计数的方式,数值的表示形式 数一下方块的个数 汉字:十一 十进制:11 二进制:1011 八进制:13 l 多种进制:十进制.二进制.八进制.十六进制. ...
- 在Eclipse中使用MAT分析Android程序内存使用状况(转)
对于Android这种手持设备来说,通常不会带有太大的内存,而且一般用户都是长时间不重启手机,所以编写程序的时候必须要非常小心的使用内存,尽量避免有内存泄露的问题出现.通常分析程序中潜在内存泄露的问题 ...
随机推荐
- Ext JS表单Ext.form.FormPanel
1.表单 对于传统的b/s应用来说,数据录入元素是放在表单<form>标签里面的.而对于ExtJS应用来说,则可以直接使用FormPanel控件来存放表单中的元素.FormPanel继承自 ...
- C 语言 进阶
清单狂魔,只挖坑不填坑.. 前言 最近经常被询问 C 语言 相关的问题,突然便也觉得需要思考一下 C 语言的进阶了. 我用 C 语言写过的最大的一个项目,也只是那个贪吃蛇,后来就断断续续地用 Pyth ...
- 爬虫:Scrapy7 - Scrapy终端(Scrapy shell)
Scrapy 终端是一个交互终端,可以在未启动 spider 的情况下尝试及调试你的爬取代码.其本意是用来测试提取数据的代码,不过可以将其作为正常的 Python 终端,在上面测试任何 Python ...
- mysql常见面试题目
1, mysql的复制原理以及流程. (1)先问基本原理流程,3个线程以及之间的关联. (2)再问一致性,延时性,数据恢复. (3)再问各种工作遇到的复制bug的解决方法 2,mysql中myisam ...
- Windows Server 创建环回网卡
1.以管理员身份运行cmd后,在cmd命令窗口中执行:hdwwiz 启动硬件添加向导. 2.在添加硬件向导中选择手动安装或自动搜索都可以.然后选择网络适配器. 3.选择网络适配器:厂商选择Micros ...
- 适配器模式 & 装饰器模式
一.适配器模式:简单来讲,就是为了方便使用,完成从 一个接口 到 另一个接口 的 转换,这个负责转换的就是 适配器例如:Reader ——> InputStreamReader 通过类内部组合 ...
- 百度之星初赛(A)——T5
今夕何夕 Problem Description 今天是2017年8月6日,农历闰六月十五. 小度独自凭栏,望着一轮圆月,发出了“今夕何夕,见此良人”的寂寞感慨. 为了排遣郁结,它决定思考一个数学问题 ...
- Spring的属性依赖检查
spring支持4种依赖检查:默认的是none none – No dependency checking. simple – If any properties of primitive type ...
- PHP命令行执行程序php.exe使用及常用参数
PHP命令行执行程序php.exe参数说明 -f <file>:以命令行方式运行指定的PHP文件,只要指定具体的PHP文件(带绝对路径),php.exe就可以执行PHP文件,所以这个参数单 ...
- 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---57
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: