Automate Everything

关于自动化相关的任何东西,包括自动化测试,Visual Studio宏, 自动化安装部署等

Archive for the ‘内存泄露’ Category

.Net 内存泄露检查以及垃圾回收机制

星期三, 07月 16th, 2008

现在在做Memory Leak的测试,需要覆盖到Native的C++ Code和Managed C# Code,下边是学习笔记和一些自己的想法…

Native的C++代码来说,内存泄露就是New的对象没有delete,概念相对Managed来说要简单很多,而且很好理解,可以用Memory Validator来做,这个工具会很明显的给出什么地方可能会有内存泄露,并给出Call Stack,我们可以看到在哪个对象New了以后没有delete。我们通过在整个solution中搜索这个变量,去看对象有没有被Return、赋值或者delete,如果都没有的话,那说明这个地方是一个内存泄露。

对Managed的C#代码来说,内存泄露的概念就跟Native的C++概念不同。因为所有的New所分配的内存是在托管堆上分配的,所以不存在一般意义上的内存泄露。对Managed Code来说,内存泄露就是指一些没有用的对象被reference,导致GC不能回收,从而造成这部分内存相对泄露(这个是我自己的概念^_^)。我们可以通过.Net Memory Validator和.NET Memory Profiler 3.1来跟踪内存的使用情况,从而分析内存泄露。

两个例子:

1. 比如一个全局的ArrayList里边New了很多的对象,这个ArrayList只在一个函数里边使用,那么在这个函数调用结束的时候,就必须给ArrayList赋值为null。否则这个全集的ArrayList只能等到程序结束的时候才能被释放,在这个期间因为ArrayList的引用,导致ArrayList里边的对象不能被释放回收。

2. 比如一个SolidBrush对对象,没有包括在using语句中,那个这个对象就不会自动被调用despose接口,导致内存泄露。

把这篇文章分享到: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • del.icio.us
  • bodytext
  • Google
  • Facebook
  • Furl