🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
> # 垃圾回收方式 1. **引用计数(Reference Counting):** * **原理:** 引用计数算法通过为每个对象维护一个引用计数器,记录引用该对象的引用数量。当引用计数为零时,表示该对象不再被引用,可以被释放。 * **优点:** 实现简单,对实时性要求高,及时回收垃圾。 * **缺点:** 难以处理循环引用,引用计数的维护和更新可能会带来额外的开销。 2. **标记-清除(Mark and Sweep):** * **原理:** 标记-清除算法通过两个阶段完成垃圾回收。首先,标记阶段遍历所有可达对象,并标记为活动对象。然后,在清除阶段,回收未标记的对象,即未被引用的对象。 * **优点:** 能够处理循环引用,相对于引用计数更灵活。 * **缺点:** 可能导致内存碎片,垃圾回收时需要停止程序执行。 3. **分代收集(Generational Garbage Collection):** * **原理:** 分代收集算法基于“弱分代假设”,即大部分对象很快就会变成垃圾。将对象按照年龄分为不同的代(Generation),新创建的对象在年轻代,经过多次垃圾回收后仍存活的对象逐渐晋升到老年代。对年轻代使用较为频繁但相对短暂的垃圾回收,对老年代使用较为稀少但更耗时的垃圾回收。 * **优点:** 针对不同生命周期的对象采用不同频率的垃圾回收,提高了效率。 * **缺点:** 算法相对复杂,需要维护对象的年龄信息。 4. **复制算法(Copying Garbage Collection):** * **原理:** 复制算法将内存区域划分为两个大小相等的半区,称为`From`区和`To`区,在任何时候,只有一个半区被使用,另一个半区保持空闲。垃圾回收时,将存活的对象从当前使用的半区复制到空闲的半区,按照对象存活的顺序排列。复制完成后,交换`From`和`To`区的角色,清空原`From`区。 * **优点:** 高效的内存分配,消除内存碎片,垃圾回收时间与存活对象数量相关 。 * **缺点:** 内存利用率低,要两个半区进行备份,内存利用率只有50% 。不适合存活时间较长的对象,存活率高时,复制成本高。 - [一文搞懂七种基本的GC垃圾回收算法](https://new-coder.com/pc/post/f9537f31edb7) --- >### Go垃圾回收器的演变 - 标记-清除是一个分阶段的过程,先标记再清除,且两阶段都需要遍历整个堆 - 三色标记是一种增量式(incremental)或并发式(concurrent)垃圾回收算法,旨在减少垃圾回收的停顿时间。 1. **初期版本(Go 1.0之前)**: * 使用了简单的标记-清除算法。这个版本的GC在执行垃圾回收时需要暂停整个应用程序(称为“Stop-the-world”),这会导致显著的停顿时间,影响应用程序的性能和用户体验。 2. **Go 1.0至Go 1.4**: * 改进了标记-清除算法,但仍然是“Stop-the-world”GC。在这些版本中,GC的性能有所提升,但在进行垃圾回收时,应用程序仍会有较长时间的停顿。 3. **Go 1.5**: * 引入了并发标记-清除GC。这个版本的GC使用了三色标记算法,并支持并发执行。这意味着垃圾回收器可以在应用程序运行的同时进行标记和清除操作,大大减少了停顿时间。具体来说: * 标记阶段是并发的,即多个标记线程可以在应用程序运行时同时标记对象。 * 清除阶段仍然需要暂停应用程序,但停顿时间相比之前大大减少。 4. **Go 1.6及以后**: * 持续改进并发GC,引入了更多的优化,例如减小停顿时间、优化内存使用等。 * Go的GC逐步演变为一个完全并发、增量式的GC,进一步减少了停顿时间,并提高了性能和响应性。 > 相关阅读 - [Golang三色标记、混合写屏障GC模式图文全分析](https://www.codenong.com/cs106915910/) - [图解Golang垃圾回收机制](https://learnku.com/articles/59021) - [Golang垃圾回收+混合写屏障GC全分析](https://zhuanlan.zhihu.com/p/334999060)