当前位置:编程学习 > C#/ASP.NET >>

.NET中CLR的内存管理(垃圾回收)

1,什么是垃圾Garbage?

  每一个应用程序都有一组根root。根可以用来标志存储位置,这些位置指向托管堆中的对象或者被设为null的对象,称为活动根,并形成一个活动根列表。JIT编译器和CLR维护着活动根列表,列表能够被垃圾收集器算法访问。这样,垃圾被定义为从活动根列表中不能访问的堆上对象。

\

2,垃圾是怎么回收的?

  当垃圾收集器开始运行的时候,它假设堆中的对象都是垃圾,换而言之,它假设应用程序中没有任何根指向堆中的对象。GC开始遍历根列表,并建立一个所有从根可以到达的对象图。例如,GC可能会定位指向堆中对象的全局变量,然后递归遍历所有可到达的对象。当这部分对象图遍历完成时,GC将检查下一个根并遍历其中的对象。

垃圾回收器的遍历:一、GC对任一组对象只编译一次,提高性能;二、如果存在对象循环链表,则可避免无限循环。

\

3,垃圾回收器的性能

  垃圾回收的性能取决于:一、托管堆的大小;二、垃圾的多少;三、托管堆中对象是否定义了finalize()方法。(对可回收对象调用finalize方法会减缓垃圾回收的速度)

  另一个瓶颈是堆中的大对象。如果C盘结构最为一棵树保留在内存中,当另一个程序在执行过程中连续的引用这棵树,这时候这棵树持续被保留在堆中而永远不会被作为垃圾回收。处理这样的大对象时,最好的办法是:垃圾回收和应用程序访问同时进行。这种方法通过弱引用(weak reference)实现的,该机制基于对访问和垃圾回收时机的选择!一方面,如果对象只是存在弱引用,而且GC正在运行,则该对象会被回收。随后如果有程序访问这个对象,访问会失败。另一方面,要访问弱引用的对象,应用程序就必须获得该对象的一个强引用,那么由于该对象存在强引用,GC就不能回收该对象。

  还有,GC分代回收或者只压缩部分堆来提高性能。GC分代回收建立在三个假设之上:越是新的对象生命周期越短;越是老的对象生命周期越长;新的对象之间有更强的关联性并经常被访问。

  注意:GC算法不是一成不变的,为了保证性能的最优化,它是CLR中调整的较为频繁的一部分。

    
补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,