垃圾回收器
作者:互联网
什么是垃圾回收?在创建对象的时候程序会给对象分配内存空间,但是空间不是无限的,所以需要对已经不再使用的对象(垃圾)进行内存空间的回收(释放),这个过程叫垃圾回收。
在C#中垃圾回收是自动完成的,程序员不需要手动实现,但是这个过程对程序性能会产生影响,那么什么时候会触发垃圾回收?
- 物理内存地址不够时,由OS通知程序
- 堆上对象的内存超过了某个规定的阈值
- 手动调用GC.Collect方法
C#将堆分为大对象堆和小对象堆,大对象堆中的对象一般不进行释放,通常释放的是小对象堆中的内存空间
C#将静态字段、局部变量、CPU 寄存器、GC 句柄和终结队列等作为根(root),使用DFS或BFS算法进行遍历,并将被遍历的对象标记,并清除未被标记的对象,然后将其进行压缩,以便释放出连续的内存空间,压缩完成后,将其放在托管堆中,并根据其生存长短分成3代。
C#根据对象的生存长短将其分为三代:
- 第0代,这是生存时间最短的一代,垃圾回收经常回收这里的对象,对于没有回收的对象,将其升级为第一代。
- 第1代,这是和第二代之间的缓冲代,在第0代中没有被回收的对象会被升级为第1代,垃圾回收较少次数的回收这里的对象
- 第2代,这里存放的基本都是大对象,第一代中没有被回收的对象会被放到第2代
标签:对象,内存空间,回收,C#,垃圾,堆中 来源: https://www.cnblogs.com/aikeming/p/16652580.html