Go-性能优化、自动内存管理
性能优化:
1.业务代码:特定场景的具体问题具体分析
2.SDK
3.基础库
4.语言运行时:解决通用问题 Tradeoffs
5.OS
自动内存管理Garbage collector(GC)
管理的是动态内存:malloc()
所以管理动态内存就是垃圾回收
可以解决:double-free use-after-free问题
在CVE漏洞平台上能看到 double-free 和use-after-free是很多的
任务:
1.新对象分配空间
2.找到存活对象
3.回收死亡对象
名词:
Mutator:业务线程,分配新对象
Collector:GC线程,找到存活的,回收死亡的
Serial GC:只有一个collector
Parallel GC:多个collector
Concurrent GC:能既创建 又回收(同时)
评价GC算法:
安全性:不能回收存活的对象
吞吐率:花在GC上的时间
暂停时间:业务是否感知
内存开销:GC元数据开销
追踪垃圾回收:标记根对象-找到可达对象-清理不可达对象
分代GC:most objects die young 每个对象都有年龄 分区
young generation
的对象 存活的很少 可以copying collection
old generation
的对象 趋向于一直活着 复制反而开销比较大 用mark-sweep collection
也可以引用计数:大于零就存活(这个就是内存管理和程序执行中了)类似于C++的智能指针。缺点是:原子操作开销大,循环引用,内存开销。