GC基本概念
面试题
- 垃圾回收是什么?
- GC 垃圾回收算法都有哪一些?
垃圾回收
垃圾回收主要是指堆上的内存分配和回收,C#中会定时对堆内存进行GC操作。
- NET 的垃圾回收器管理应用程序的内存分配和释放。 每当有对象新建时,公共语言运行时都会从托管堆为对象分配内存。 只要托管堆中有地址空间,运行时就会继续为新对象分配空间。 不过,内存并不是无限的。
- 垃圾回收器最终必须执行垃圾回收来释放一些内存。
- 垃圾回收器的优化引擎会根据所执行的分配来确定执行回收的最佳时机。
- 执行回收时,垃圾回收器会在托管堆中检查应用程序不再使用的对象,然后执行必要的操作来回收其内存。
垃圾回收器(Garbage Collector)
- 在CLR中的自动内存管理,就会使用垃圾回收器来执行内存管理,其会定时执行,或者在申请内存分配是发现内存不足时触发执行,也可以手动触发执行(System.GC.Collect)
垃圾回收器具有以下优点
- 开发人员不必手动释放内存。
- 有效分配托管堆上的对象。
- 回收不再使用的对象,清除它们的内存,并保留内存以用于将来分配。 托管对象会自动获取干净的内容来开始,因此,它们的构造函数不必对每个数据字段进行初始化。
- 通过确保对象不能自己使用分配给另一个对象的内存来提供内存安全。
垃圾回收的几种基本算法
- 标记清除算法(Mark-Sweep)关键点是,清除后,并不会执行内存的压缩
- 复制算法(Copying) 内存等额划分,每次执行垃圾回收后,拷贝不被回收的内存到没有被使用的内存块,自带内存压缩,弊端是内存浪费大(每次只能使用部分,预留部分给拷贝使用)
- 标记整理算法(Mark-Compact)关键点,清除后,会执行内存压缩,不会有内存碎片
- 分代收集算法(Generational Collection)对内存对象进行分代标记,避免全量垃圾回收带来的性能消耗。