Net Memory Profiler 分析.Net程序内存泄露
Net Memory Profiler 分析.Net程序内存泄露
Haozes's Tech Space
人類的全部才能無非是時間和耐心的混合物
使用.Net Memory Profiler 分析.Net程序内存泄露
.Net 内存泄露无外乎那几类:
引用未消除,事件未删除
如果是WPF应用程序,常见的有Image 对象释放问题,绑定到非依赖属性或未实现INotifyPropertyChanged 接口的对象属性.这里不细述.
本文介绍如何使用强大的.Net Memory Profiler 分析.Net 应用程序内存泄露. 使用的Demo 是 使用Mdbg.exe 调试.net 程序 中的Demo.
Sample Code:

namespace MemLeakProfileDemo
{ public partial class Form1 : Form
{
private Fool fool;
private FoolBrother brother; public Form1()
{
InitializeComponent();
fool = new Fool();
brother = new FoolBrother();
//引用fool
brother.YoungFool = fool;
} private void btnAlloc_Click(object sender, EventArgs e)
{
var i = 10;
//AllocalHugeMem 会申请10M的内存
fool.AllocalHugeMem();
} private void btnWrongRelease_Click(object sender, EventArgs e)
{
//虽然fool 指向null,但 brother保留了对fool的引用,GC无效果.内存泄露
fool = null;
GCRelease();
} private void btnRightRelease_Click(object sender, EventArgs e)
{
//消除 brother 对fool的引用,GC效果明显
fool = null;
brother = null;
GCRelease();
} private void GCRelease()
{
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
}
} public class Fool
{
private IList<byte[]> list = new List<byte[]>(); public void AllocalHugeMem()
{
var buffer = new byte[10 * 1024 * 1024];
for (int i = 0; i < buffer.Length; i++)
{
buffer[i] = 1;
}
list.Add(buffer);
}
} public class FoolBrother
{
public Fool YoungFool
{
get;
set;
}
}
}

- 使用.Net Memory Profiler 启动 Demo.exe,

- 先抓个快照(Collect Snapshot)
- 多点击几次 Allocal Mem 按钮,申请内存,再点击 Wrong Release Mem 按钮.再抓个快照.
此时:
//虽然fool 指向null,但 brother保留了对fool的引用,GC无效果.内存泄露
fool = null;
GCRelease();
由于有个 FoolBrother 对象强引用了fool对象,fool对象无法被GC掉. 通过强大的工具,我们可以直观的看到:

有一个Fool 对象instance 未被释放.双击该行查看:

可以看到该对象引用的计数是1,GC 的Age,右边是创建该对象的堆栈.
双击Instances 行.出现清晰的引用关系图:

一切尽在眼前!
反之,可以点击 Right Release Mem 按钮,将FoolBrother 对象清除,再抓快照,对比效果.
回头有时间再用此Demo 介绍如何使用Windbg SOS扩展找出内存泄露.
Net Memory Profiler 分析.Net程序内存泄露的更多相关文章
- 在Eclipse中使用MAT分析Android程序内存使用状况(转)
对于Android这种手持设备来说,通常不会带有太大的内存,而且一般用户都是长时间不重启手机,所以编写程序的时候必须要非常小心的使用内存,尽量避免有内存泄露的问题出现.通常分析程序中潜在内存泄露的问题 ...
- 使用CLR Profiler分析.NET程序
使用CLR Profiler分析.NET程序 就像剥去.NET语法糖衣的工具(Reflector等)很多一样,我们可以用来分析.NET程序性能的工具有很多,如前面一片博文DebugLZQ给大家介绍的v ...
- jprofiler 查看程序内存泄露
在最近的工作中,通过JProfiler解决了一个内存泄漏的问题,现将检测的步骤和一些分析记录下来,已备今后遇到相似问题时可以作为参考. 运行环境: Tomcat6,jdk6,JProfiler8 内存 ...
- NET Memory Profiler 跟踪.net 应用内存
NET Memory Profiler 跟踪.net 应用内存 用 .NET Memory Profiler 跟踪.net 应用内存使用情况--基本应用篇 作者:肖波 .net 框架号称永远 ...
- 使用Analyze 和Instruments-Leaks分析解决iOS内存泄露
版权声明:本文为博主原创文章,未经博主允许不得转载. 使用Analyze和Instruments-Leaks分析解决iOS内存泄露 实验的开发环境:Xcode 7 一.使用Product-An ...
- 利用内存分析工具(Memory Analyzer Tool,MAT)分析java项目内存泄露
转载:http://blog.csdn.net/wanghuiqi2008/article/details/50724676 一.开发环境: 操作系统:ubuntu 14.04 IDE:Eclipse ...
- 使用JProfiler分析定位java内存泄露memory leak
使用jprofiler远程profile JBoss应用服务器 项目中发现JBoss出现内存泄露, 从2G一直涨到3.5G左右 开始考虑使用jmap dump出内存来, 在用jhap打开浏览器分析. ...
- 如何用MAT分析Android应用内存泄露
使用工具:Android Studio 2.0 Preview, Android Device Monitor, MAT(Memory Analyzer). 点击Android Studio工具栏上的 ...
- Unix下C程序内存泄露检测工具:valgrind的安装使用
Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具. Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Goo ...
随机推荐
- 14.3.3 Locks Set by Different SQL Statements in InnoDB 不同的SQL语句在InnoDB里的锁设置
14.3.3 Locks Set by Different SQL Statements in InnoDB 不同的SQL语句在InnoDB里的锁设置 locking read, 一个UPDATE,或 ...
- Linux shell中的I/O重定向相关(转)
1. 基本概念(这是理解后面的知识的前提,请务必理解) a. I/O重定向通常与 FD有关,shell的FD通常为10个,即 0-9: b. 常用FD有3个,为0(stdin,标准输入).1(std ...
- 2013 吉林通化邀请赛 Tutor 有点坑的水题
计算12个数的和的平均数.四舍五入,不能有后导0. 我的做法是,将答案算出后,乘以1000,然后看个位是否大于等于5,判断是否要进位…… #include<iostream> #inclu ...
- ExtJS学习--------Ext.Element中的经常使用事件和其它重要的方法学习(实例)
经常使用事件: 其它重要方法: 详细实例:(实例结果能够将相应的代码取消凝视进行測试) Ext.onReady(function(){ Ext.create('Ext.panel.Panel',{ t ...
- ios 上拉载入下拉刷新Dome
为练手写了一个小的上拉载入很多其它下拉刷新的小的Dome . 没有太多的技术含量,仅仅是作为新手的启示用.是上一篇下拉载入的扩展.先看一下那个再看这个就easy非常多. Dome下载:http://d ...
- 找工作笔试面试那些事儿(8)---常问的CC++基础题
这一部分是C/C++程序员在面试的时候会被问到的一些题目的汇总.来源于基本笔试面试书籍,可能有一部分题比较老,但是这也算是基础中的基础,就归纳归纳放上来了.大牛们看到一笑而过就好,普通人看看要是能补上 ...
- Android NDK入门实例 计算斐波那契数列一生成jni头文件
最近要用到Android NDK,调用本地代码.就学了下Android NDK,顺便与大家分享.下面以一个具体的实例计算斐波那契数列,说明如何利用Android NDK,调用本地代码.以及比较本地代码 ...
- 属性“dataProvider”有多个初始值设定项。(注意:“dataProvider”是“mx.charts.BarChart”的默认属性)。
1.错误描写叙述 属性"dataProvider"有多个初始值设定项.(注意:"dataProvider"是"mx.charts.BarChart&q ...
- hdu3240 Counting Binary Trees
Counting Binary Trees Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- PHP实现插入排序算法
插入排序(Insertion Sort),是一种较稳定.简单直观的排序算法.插入排序的工作原理,是通过构建有序序列,对于未排序的数据,在有序序列中从后向前扫描,找到合适的位置并将其插入.插入排序,在最 ...