这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
青训营课程第四节,学习总结。
学习收获:通过对这次课程的学习,最大的收获就是对自动内存管理的了解。这也是今天的重点,自动内存管理不仅在Go语言,在其它语言比如Java中也同样存在。
知识点介绍
本节课程的主要内容如下,其中重点是自动内存管理。
- 自动内存管理
- Go内存管理及优化
- 编译器和静态分析
- Go编译器优化
课程重点内容
本节的知识点中,自动内存管理和静态分析部分都是通用的知识,学习其它语言的开发同样可以了解。
这里详细介绍一下自动内存管理,因为Java中同样也有垃圾回收机制,详细了解自动内存管理也有助于我们对于Jvm的理解。
自动内存管理
自动内存管理也就是我们常说的垃圾回收,是程序在运行时根据需求动态的管理内存的一种机制。可以避免我们去手动的管理内存,专注于实现业务逻辑,同时保证内存使用的正确性和安全性。
下面我们来了解一下自动内存管理中的相关概念:
- Mutator: 业务线程,分配新对象,修改对象指向关系
- Collector: GC 线程,找到存活对象,回收死亡对象的内存空间
- Serial GC: 只有一个 collector
- Parallel GC: 并行 GC,支持多个 collectors 同时回收的 GC 算法
- Concurrent GC: 并发 GC,支持 mutator(s) 和 collector(s) 同时执行的 GC 算法。
在自动内存管理中,我们要求Collector必须能够感知对象指向关系的改变,这样才能够保证自动内存回收的安全性和准确性。
下面我们看一下两种垃圾回收的方法:
追踪垃圾回收
追踪捡垃圾回收机制的大致流程如下:
首先对根对象(静态变量、全局变量、常量、线程栈等),然后从根对象出发,找到所有的可达对象,对所有的可达对象进行标记。最后对所有未标记的对象进行清理。
引用计数
引用计数的垃圾回收机制大致流程如下:
在程序运行时,对每一个对象都添加一个相关的引用数目,只要有引用指向这个对象(即引用数大于0)就说明这个对象是存活的。
这种方法的优点在于内存管理的操作与程序执行的过程同时进行,内存管理不需要了解运行时的实现细节。
但是同时也存在着如下的缺点:
- 需要对每个对象维护一个引用计数,开销比较大
- 没有办法对环形数据结构进行回收
- 当我们同时释放大量内存需要对其进行回收时,依然可能发生暂停。
课后总结
我认为本节课最大的收益是加深了对内存管理的理解,同时了解了编译器和静态分析。这部分的知识不仅仅是局限于Go的,很多语言都内置了内存管理,这对于我们对其它语言的学习也是十分有益的。同时我们也可以通过和其它语言类比的方式,更加深刻的了解Go语言以及它的优势。