.Net中的垃圾回收理论简述
垃圾回收理论简述
绪论
在应用程序的开发中,内存管理曾是一件令人痛苦的事情,更不用提存在很多安全漏洞了。内存管理不好的应用程序会不断消耗系统资源并最终导致操作系统的崩溃。通过利用垃圾回收起来管理程序进程中分配的内存,.Net解决了这个问题。这样,开发人员就不用进行枯燥的工作来保证将所有分配的内存都正确地是放给系统。
引用计数
在对象创建后,垃圾回收器会从现有的应用程序内存池分配内存,如果有必要,还会增加内存池来满足内存分配。对象在创建后,只有一个引用是指向对象的。随着代码的执行,垃圾回收器会跟踪对象的引用数量。每增加一个引用,计数器加1。当引用离开作用域以后,计数器就减少。当引用计数器达到0时,就将该对象和对象所占用的内存标记为回收。
Generation(代)
为了提供高效的内存管理,垃圾回收(GC)的基本思路是新创建的对象具有较短的生存期。这些对象会在托管队的底部创建。
随着对象老化,对象在generation阶梯上移。需要回收对象时,垃圾回收器会按照最低到最高的顺序来扫描generation,因此最低的generation即generation0倍扫描的次数最多,而generation2则扫描得最少。
回收
GC实现完全回收和部分回收。在完全回收期中,程序会停止执行。停止执行后,GC就可以自由的移动内存并安排地址而不会影响到正在执行的程序,而且GC会在完全回收周期中定位所有生存的和已经死亡的对象。将生存的对象上移一个generation,并回收死亡对象。可见完全回收是很费时的,因此GC实现了一种部分回收的算法来提供最优的性能。
部分回收
部分回收的前提是generation0种对象的生存期往往比generation1种对象的短,generation阶梯上的情况以此类推。GC会扫描根(对象指针)并判断哪些对象可以到达,哪些对象不可以到达。在立项情况下,generation0中的对象回收频率要比generation1的对象高。因此,GC扫描generation0的次数要比扫描generation1和2的次数多。
不确定的终止
关于GC,经常有围绕非确定终止这个话题展开的热门讨论。本质上,非确定终止是指无法确切的智谋个对象被回收的时间。乍一看这似乎并不是一个重要的论题,然而,考虑到要处理宝贵的资源,如数据库廉洁、套接字连接及图形资源,这就是个大问题了。
总结
想实现高效内存使用和更快的generation0回收,参考下面列表中的几个基本点:
- 限制对象的分配
- 使对象尽可能地小。不要创建过度冗长的代码。
- 使对象的引用减少
以上就是关于.Net中GC的基本介绍。请参考Rotor共享原代码来获得更多细节内容。