前言
一般来说.NET程序员是不用担心内存分配释放问题的,因为有垃圾收集器(GC)会自动帮你处理。但是GC只能收集那些不再使用的内存(根据对象是否被其它活动的对象所引用)来确定。所以如果代码编写不当的话,仍然会出现内存泄漏的问题,常见的情况有:一个静态变量引用了一个应该被释放的对象,事件注册后不解除注册,非托管资源使用后没有手动释放。不断的内存泄漏终会引起内存不足,挂掉你的程序。
对于这种内存泄漏问题,有很多的分析工具可以使用,常见的有CLRProfiler、ANTS Performance Profiler等。不过从vs2013起,vs自带了一个分析工具-Diagnostic Tool,默认debug时会自动打开,如果没有打开的话就按快捷键Ctrl+Alt+F2。
开始使用
这里以静态变量持有应释放的对象为例,简单介绍下使用方法。
这里有个winform程序,主要功能即使点击按钮后,输出名为“jim”的个人信息:
private void button1_Click(object sender, EventArgs e) { var p = PersonManager.Get("jim"); label1.Text += p.Name + " " + p.Age + "\n"; }
Person和PersonManager类的信息如下:
namespace MemLeak { public class Person { public string Name { get; set; } public int Age { get; set; } public byte[] BinaryData { get; set; } } public static class PersonManager { static List<Person> people = new List<Person>(); public static List<Person> People { get { return people; } } public static Person Get(string name) { //正常逻辑 //var per = People.FirstOrDefault(o => o.Name == name); //if(per==null) //{ // per = new Person(); // per.Age = 23; // per.Name = name; // per.BinaryData = File.ReadAllBytes(@"D:\2.zip");//一个38MB的文件 // people.Add(per); //} //return per; //错误逻辑 Person p = new Person(); p.Age = 23; p.Name = name; p.BinaryData = File.ReadAllBytes(@"D:\2.zip");//一个38MB的文件 people.Add(p); return p; } } }