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

本文详细介绍了垃圾回收的基本概念,包括垃圾的定义、垃圾回收的过程及其性能影响因素。文章还探讨了垃圾回收器如何通过遍历活动根列表来确定哪些对象是活跃的,以及如何处理大对象和使用弱引用的方法来提高垃圾回收效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,什么是垃圾Garbage?

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

2,垃圾是怎么回收的?

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

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

3,垃圾回收器的性能

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

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

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

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

 

转载于:https://www.cnblogs.com/zhangkuntel/archive/2010/01/21/1653089.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值