Visual Studio 2013 新功能 Memory Dump 分析器
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载。
TechEd2013 发现新功能
12月5日和6日,在国家会议中心参加了微软的 TechEd2013 技术大会,了解了很多微软所提供的软件新功能和新技术。
在上面的图中描述了在 Visual Studio 2013 中提供了新的功能 .NET Memory Dump Analysis,在具体的 Visual Studio 2013 新功能介绍的 Session 看到了实际的演示。当时感觉这个新功能对开发人员太有帮助了,因为使用 WinDbg 进行内存泄漏等问题排查总是一种痛苦。如果能在 Visual Studio 中包含类似的功能就再好不过了。
准备尝鲜 .NET Memory Dump Analysis
回到家,自然是想使用 Visual Studio 2013 直接上手实际体验下。
在创造了一个 Dump 文件之后,使用 Visual Studio 2013 直接打开,
结果发现,在 Actions 处少一个 "Debug Managed Memory" 按钮。
它应该长这个样子才对:
Google 之后发现原来我使用的是 Visual Studio 2013 Premium 版本,而该功能只有在 Visual Studio 2013 Ultimate 版本中才支持。
公司的 MSDN 订阅选的是 Premium ,比较了下与 Ultimate 的区别,价格果真差的很大。
此时,我选择了安装个 Windows 7 SP1 虚拟机,并安装 Visual Studio 2013 Ultimate 的试用版。
遭遇 Visual Studio 2013 的 Known Issue
显然,安装上 Visual Studio 2013 Ultimate 之后,再打开 Dump 文件,就可以成功看到 Actions 中的 "Debug Managed Memory" 按钮。
点击该按钮,等待 Heap View 显示。
什么?白屏?一万只马飘过。
这可真是郁闷,折腾了半天都没反应。
于是只能问 Google 了,显然,新的功能暂时没什么人用,也搜不到什么有用的讨论。
终于,当搜索关键词修改为 “Visual Studio 2013 Debug Managed Memory is not work” 时,有用的信息出现了。
打开一看,这居然是一个 Visual Studio 2013 Known Issue,基本就是要求安装 IE10 或以上的版本才能使用此功能。
解决办法,当然就是安装新版 IE,立马下载安装 IE11。新装的虚拟机中的 Windows 7 默认的还是 IE8 。
使用 Dump 文件比较功能
这一次,成功看到了 Heap View。
在 Compare to 中选择一个之前的 Dump 文件作为对比,即可查看两个文件时间的内存变化。
Inclusive Size
在 Heap View 中,有一列为 Inclusive Size (Bytes)。
其包含所显示对象引用的所有对象内存占用的总和。下面的图标展示了内存占用大小的计算过程。
Object Type |
Count |
Size (Bytes) |
Inclusive Size (Bytes) |
Customer |
1 |
100 |
400 |
Address |
1 |
50 |
200 |
String |
2 |
150 |
150 |
Byte[] |
1 |
100 |
100 |
Address 对象的 Inclusive Size = Address (50 bytes) + String (50 bytes) + Byte[] (100 bytes) = 200 bytes
Customer 对象的 Inclusive Size = Address Inclusive Size (200 bytes) + String (100 bytes) + Customer (100 bytes) = 400 bytes
Inclusive Size Diff
在使用 Dump 比较功能后,显示的列中会出现 "Inclusive Size Diff",用来描述在两个 Dump 文件采集的时间点时,Inclusive Size 的变化。
View Setting
在 Dump 比较的界面中,我们可以看到 View Settings 选项。
- Just My Code :顾名思义,仅显示用户代码。
- Collapse Small Objects :隐藏小对象。
这里需要描述下,小对象隐藏后的 Inclusive Size 的计算方式。
实际上,会将被隐藏的小对象的大小累加到父对象上。
仍然使用上面的图例进行计算。
我们假设 String 和 Byte[] 被隐藏,在隐藏小对象后,
Object Type |
Count |
Size (Bytes) |
Inclusive Size (Bytes) |
Customer |
1 |
200 |
400 |
Address |
1 |
200 |
200 |
Paths To Root View
点击 Heap View 列表中的某一个 Object Type,在 Paths To Root 中会通过级联方式显示对象的引用关系。
这用于显示,是哪个对象引用导致该对象没有被垃圾回收。
References View
References View 用于显示,这个对象都引用了哪些对象。
测试用代码
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading; namespace TestDebugMemoryDumpFile
{
class Program
{
static ConcurrentQueue<Tree> _leakedTrees = new ConcurrentQueue<Tree>(); static void Main(string[] args)
{
List<string> fruits = new List<string>() // 6 items
{
"Apple", "Orange", "Pear", "Banana", "Peach", "Hawthorn",
}; Random random = new Random();
while (true)
{
string fruitName = fruits[random.Next(, )];
Tree fruitTree = new Tree(fruitName);
BuildFruitTree(fruitTree, ); // 100M
_leakedTrees.Enqueue(fruitTree); Console.WriteLine("Added [{0}] on [{1}]...",
fruitTree.Name,
DateTime.Now.ToString(@"yyyy-MM-dd HH:mm:ss.ffffff")); Thread.Sleep(TimeSpan.FromSeconds());
}
} private static void BuildFruitTree(Tree fruitTree, int leafCount)
{
Console.WriteLine("Building [{0}] on [{1}]...",
fruitTree.Name,
DateTime.Now.ToString(@"yyyy-MM-dd HH:mm:ss.ffffff")); for (int i = ; i < leafCount; i++) // size M
{
Leaf<byte[]> leaf = new Leaf<byte[]>(Guid.NewGuid())
{
Content = CreateContentSizeOfOneMegabyte()
};
fruitTree.Leaves.Add(leaf);
}
} private static byte[] CreateContentSizeOfOneMegabyte()
{
byte[] content = new byte[ * ]; // 1 M
for (int j = ; j < content.Length; j++)
{
content[j] = ;
}
return content;
}
} internal class Tree
{
public Tree(string name)
{
Name = name;
Leaves = new List<Leaf<byte[]>>();
} public string Name { get; private set; }
public List<Leaf<byte[]>> Leaves { get; private set; }
} internal class Leaf<T>
{
public Leaf(Guid id)
{
Id = id;
} public Guid Id { get; private set; }
public T Content { get; set; }
}
}
参考资料
- What’s New for the Debugger in Visual Studio 2013
- Use Dump Files to Debug App Crashes and Hangs in Visual Studio
- Using Visual Studio 2013 to Diagnose .NET Memory Issues in Production
- .NET Memory Analysis Enhancements in Visual Studio 2013
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载。
Visual Studio 2013 新功能 Memory Dump 分析器的更多相关文章
- Visual Studio 2013新功能
微软打破了Visual Studio两年升级一次的传统,Visual Studio 2012发布还不足一年,微软就计划发布了Visual Studio 2013了.在今天的TechEd大会上,微软宣布 ...
- (转)Visual Studio 2013新功能预览:增代码的透明度和可追溯性
微软打破了Visual Studio两年升级一次的传统,Visual Studio 2012发布还不足一年,微软就计划发布了Visual Studio 2013了.在今天的TechEd大会上,微软宣布 ...
- 【令人振奋】【转】微软潘正磊谈DevOps、Visual Studio 2013新功能、.NET未来
日前,微软开发平台事业部全球资深副总裁潘正磊(Julia Liuson)从美国总部回到北京参加TechEd2013,在大会现场,潘正磊接受了CSDN的访谈,对于微软研发团队如何运用DevOps模式.对 ...
- Visual Studio 2013 新增功能:“Browser Link”
今天新装了 Visual Studio 2013, 使用 VS2013 打开一个现有的 WEB 网站, 在调试网站的时候出现在了脚本错误,一个文件名叫 "browserLink", ...
- Memory Dump 分析器
Visual Studio 2013 新功能 Memory Dump 分析器 TechEd2013 发现新功能 12月5日和6日,在国家会议中心参加了微软的 TechEd2013 技术大会,了解了 ...
- Visual Studio 2013 Preview - ASP.NET, MVC 5, Web API 2新功能搶先看
Visual Studio 2013 Preview - ASP.NET, MVC 5, Web API 2新功能搶先看 來自TechEd North America 2013的第一手消息 以下資訊均 ...
- Visual Studio 2013 新增web项目IIS Express的64位版 转载来源http://www.cnblogs.com/jianyus/p/3524335.html
使用Visual Studio 2012开发SharePoint的应该都遇到过下面的错误“SharePoint 在32位进程中不受支持”,而怎么修改目标平台都不好使,因为VS 2012所配备的IIS ...
- Visual Studio 2013 新增web项目IIS Express的64位版
使用Visual Studio 2012开发SharePoint的应该都遇到过下面的错误“SharePoint 在32位进程中不受支持”,而怎么修改目标平台都不好使,因为VS 2012所配备的IIS ...
- Visual Studio 2013 Preview 新功能
先来看一下Visual Studio的版本历史: 1. Visual Studio.NET 2002 2. Visual Studio.NET 2003 3. Visual Studio.NET 20 ...
随机推荐
- JQuery之正则表达式
1.定义正则表达式 /.../ 用于定义正则表达式 /.../g 表示全局匹配 /.../i 表示不区分大小写 /.../m 表示多行匹配 2.匹配正则表达式 非全局模式,不分组 var patte ...
- 理解docker容器和镜像(layer,ufs)和docker命令解释
博客好文1:http://blog.csdn.net/x931100537/article/details/49633107(理解docker容器和镜像,理解简单,从原理入手,什么是layer,什么是 ...
- APP分发渠道的竞争分析
一. 最近几年,手机APP市场发展非常迅速,随着手机的硬件水平的不断升级,大量资本涌入,越来越多的开发者从桌面平台开发转移到移动平台开发,面对数以万计的手机APP,如何推广自己的APP成了难题,APP ...
- AESwithJCE http://www.coderanch.com/how-to/content/AES_v1.html
Using AES with Java Technology By Rags SrinivasJune 2003 In September 2000, the National Institute o ...
- css3的一些新属性1
<body> /*文本阴影*/ <h1 style="text-shaow:5px 5px 5px #C0F">我爱你</h1> </bo ...
- POJ 2186-Popular Cows (图论-强联通分量Korasaju算法)
题目链接:http://poj.org/problem?id=2186 题目大意:有n头牛和m对关系, 每一对关系有两个数(a, b)代表a牛认为b牛是“受欢迎”的,且这种关系具有传递性, 如果a牛认 ...
- 退役?OR 继续
今天突然想了好多.上次CB那么决绝的退役,还有其他的一些东西.觉得大家说的都挺对的.看待问题的方式不同,然后或多或少就变了.预备役的事情就是想能不能不让大家因为上不了场退役. 想起以前的自己那么坚决的 ...
- java核心知识点学习----多线程间的数据共享和对象独立,ThreadLocal详解
线程内的数据共享与对象独立,举例:张三给李四转钱,开启A线程去执行转钱这个动作,刚好同时王五给赵六转钱,开启B线程去执行转钱,因为是调用的同样一个动作或者说对象,所以如果不能保证线程间的对象独立,那么 ...
- oracle 驱动安装备忘
ubuntu 从oracle官网下载两个必须的rpm包(这里选择的是version12.1.0.2.0, 64位操作系统) oracle-instantclient12.1-basic-12.1.0. ...
- iOS.ReactNative-4-react-native-command-line-tool
Command line tool: react-native 1. react-native 是一个命令行工具 1.1 react-native简介 运行以下命令: ls -lt `which re ...