1、什么是GC?
2、为什么会有GC?
3、GC的优点?
4、GC的缺点?
5、Go中的GC历史
6、Go中的GC实现原理(三色标记)
7、Go怎么手动调用GC?
一、什么是GC?
GC是Go语言中的内存自动回收管理器(常称为垃圾回收器)。业界常见的垃圾回收机制有引用计数、标记-清除、分代收集。
1)引用计数:对每个对象维护一个引用计数,当引用该对象的对象被摧毁时,引用计数减一,引用计数为零时回收该对象。
优点:对象可以很快被回收,不会出现内存耗尽或者达到某个阀值时才回收。
缺点:不能很好的处理循环引用(https://www.jianshu.com/p/0cfe42ed237c],而且实时维护引用计数,也有一定的代价。
代表语言:Python、Php、Swift
2)标记-清除:从根变量开始遍历所有引用的对象,引用的对象标记为“被引用”,没有被标记的进行回收。
优点:解决了引用计数的缺点。
缺点:需要STW,就是需要暂时停掉程序运行。
代表语言:Golang(使用三色标记法)
3)分代收集:按照对象生命周期长短划分不同的代空间,生命周期长的放入老年代,而短的放入新生代,不同代有不同的回收算法和回收频率。
优点:回收性能好
缺点:算法复杂
代表语言:JAVA
二、为什么会有GC?
解决开发时的内存管理的麻烦,以及避免内存泄露的麻烦。
三、GC的优点?
不再需要自己写代码进行垃圾回收,避免内存泄露的隐患。
四、GC的缺点?
占用性能,但是在这个性能过剩的时代,可以忽略不计了
五、Go中的GC历史
https://blog.csdn.net/erlib/article/details/51850912
6、Go中的GC实现原理(三色标记)
1)有哪三色?
灰色、黑色、白色
2)三色代表什么意思?
白色:未搜索
灰色:正搜索
黑色:已搜索
3)三色标记的工作原理?
起初所有对象都是白色的
扫描找出所有可达对象,标记为灰色,放入待处理队列
从队列提取灰色对象,将其引用对象标记为灰色放入队列,自身标记为黑色
写屏障监视对象内存修改,重新标色或放入队列
7、Go怎么手动调用GC?
runtime.GC()
网友评论