这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
一、本堂课重点内容:
- 作业讲解
二、作业讲解
- 从业务层和语言运行时层进行优化分别有什么特点?
答:
-
业务层优化
- 针对特定场景,具体问题,具体分析
- 容易获得较大性能收益
-
语言运行时优化
- 解决更通用的性能问题
- 考虑更多场景
- Tradeoffs
2.从软件工程的角度出发,为了保证语言 SDK 的可维护性和可拓展性,在进行运行时优化时需要注意什么?
答:保证接口稳定的前提下改进实现
3.自动内存管理技术从大类上分为哪两种,每一种技术的特点以及优缺点有哪些?
答:垃圾回收以及引用计数。
- 垃圾回收:
- 优点:垃圾回收机制可以有效的防治内存泄露,有效的使用可以使用的内存。
- 缺点:垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。
- 引用计数:
- 优点内存管理的操作被平摊到程序运行中:指针传递的过程中进行引用计数的增减;不需要了解 runtime 的细节:因为不需要标记 GC roots,因此不需要知道哪里是全局变量、线程栈等
- 缺点:开销大,因为对象可能会被多线程访问,对引用计数的修改需要原子操作保证原子性和可见性;无法回收环形数据结构;每个对象都引入额外存储空间存储引用计数;虽然引用计数的操作被平摊到程序运行过程中,但是回收大的数据结构依然可能引发暂停
4.什么是分代假说?分代 GC 的初衷是为了解决什么样的问题?
答:大部分对象朝生夕灭,存活越久的对象越不可能被回收,跨代引用是很少的。
为了解决回收大内存区域而造成的STW时间过长的问题,使用分代垃圾收集,对不同的分区使用不同的垃圾回收策略,从而降低停顿时间。
5.Go 是如何管理和组织内存的?
答:提前将内存分块。
-
调用系统调用 mmap() 向 OS 申请一大块内存,例如 4 MB
-
先将内存划分成大块,例如 8 KB,称作 mspan
-
再将大块继续划分成特定大小的小块,用于对象分配
-
noscan mspan: 分配不包含指针的对象 —— GC 不需要扫描
-
scan mspan: 分配包含指针的对象 —— GC 需要扫描
三、参考引用
1.www.shouxicto.com/article/436… 2.www.cnblogs.com/zhangxiaope… 3.juejin.cn/post/718952…