这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天 今天学习了关于go的性能优化的重要性,以及自动内存管理的一些常识和常见术语,包括一些go的垃圾回收机制等等
自动内存管理相关概念
Mutator:业务线程,分配新对象,修改对象指向关系
Collector:GC 线程,找到存活对象,回收死亡对象的内存空间
Serial GC:只有一个collector
Parallel GC:支持多个collectors同时回收的GC算法
Concurrent GC: mutator(s)和collector(s)可以同时执行
常见的发现垃圾的算法
一个是根可达算法,GC Root,另一个是引用计数法,Reference Count,一般现在都是根可达算法了,引用计数法虽然便捷,但是如果有几个垃圾循环互相引用,就不会被发现,所以,一般采用根可达算法
回收算法
回收算法大致分为三种 1.标记-复制——将存活对象复制到另外的内存空间(Copying GC)
2.标记-清除——将死亡对象的内存标记为可分配(Mark-sweep GC):使用free-list管理空闲内存
3.标记-整理——移动并整理存活对象(Mark-compact GC):原地整理对象 以Java为例,三种GC算法大致有以下几种区别
标记清除:
标记出所有不需要被回收的对象,在标记结束后统一回收掉那些没有被标记的对象,目前已废弃
由于会产生很多内存碎片,唯一一个使用该算法的垃圾回收器CMS也废弃了这种算法
标记整理:
先标记出不需要被回收的对象,让这些存活的对象像一端移动,然后清理掉边界以外的对象 这个方法由于要移动地址,所以适合GC比较少的区域使用,即老年代
标记复制:
将内存分为两个区域,每次使用其中一块,当使用的这一块需要GC时,先标记所有不需要回收的对象,将这些对象复制到另外一块去,然后一次性将空间都清除掉