前言
最近感觉自己又陷入了无尽的自我循环和自我否定,不知道自己到底是怎么了
我,出生于忧患之中,但是告诫自己,不能死于安乐。
这篇文章是收集的一些Golang进阶的知识,作为我自己更上一层楼的笔记,也希望可以帮助大家
未来将会持续性输出面试之类的八股文和算法之类的笔记,因为我感觉自己需要时间去沉淀
1 | 怀才不遇只是欺骗自己的安慰剂 |
Golang进阶需要知道的知识
理解Golang垃圾回收
垃圾回收,一般简称GC,你理解为,释放不需要的资源就行
GC的核心机制,就是后台维护一个守护线程,监控对象状态,识别不需要的对象,释放资源
Golang的垃圾回收机制进行了多次演变
1 | 1. v1.0 — 完全串行的标记和清除过程,需要暂停整个程序 |
2021年,Golang的垃圾回收机制是三色标记法搭配辅助GC还有写屏障
三色标记法是标记-清除法的一个增强版本
那么,什么是标记清除法呢
简单的说下
标记-清除法的基础原理
1 | 就是,先停止服务运行,被引用的对象打上标记 |
说白了,就是先给你停止任务,正在引用的对象被打个标签,告诉GC,这个是我的人,我罩着的,你不能动,其他的我都用过了,随便你干掉吧,GC才会去清除未引用的标记。
那么三色标记法的原理呢?
首先,三色,是哪三色,是白色,灰色,黑色
这三个分别代表三种不同的标识状态
白色代表可回收,灰色代表被黑色引用,黑色代表被程序引用
感觉有点绕,这边简单的出个示意图吧
1 | main(主程) |
现在我们有个栈,主main引用了A,B两个元素,但是B同时引用了E这个元素,根据三色标记法,三色标记的情况如下
1 | --- |
所以三色标记法GC的步骤是
1 | 1. 扫描全局数据和当前的栈区域,标记引用的对象(A,B)黑色对象 |
写屏障,简单点说,就是GC开始的时候,有一个记录器,名字叫屏障,第一次运行的时候,它会扫描各个对象的状态,第二次扫描时,会拿出来和第一次扫描的结果进行比对,也就是三色法那个记录灰色的步骤,标记被引用对象为灰色,防止丢失。
辅助GC,如果GC回收的速度过慢,赶不上程序分配对象的速度,那么这边就会暂时停止分配对象,然后将用户线程抢过来执行GC,其实整个程序现在就是停止的状态,这就是辅助GC
讲了原理,那么我们什么时候去触发GC呢?
- 达到内存阈值,阈值是由一个gcpercent的变量控制的,当新分配的内存占已在使用中的内存的比例超过gcprecent时就会触发
- 达到定时时间,如果上面的内存阈值一直达不到,那就默认2min触发一次GC。
- 手动触发GC,runtime.GC()等
理解Golang的内存分配
首先,什么是内存分配
内存分配的地位?
1 | 内存分配和垃圾回收是Golang内存管理的核心双子 |
内存分配主要解决什么问题?
1 | 主要解决协程,对象的内存分配问题 |
Golang内存分配的算法是?主要的思想是什么?
1 | TCMalloc算法,全程:Thread-Caching Malloc,中文翻译:线程缓存分配 |
对象大小有哪几种分类方法?
- 微对象 (0, 168b)
- 小对象 (16b, 32KB)
- 大对象 (32KB,无限大)
多级缓存是什么
看下这张图
1 |
|
分配小对象的步骤
1 | 1. 确定分配对象的大小 |
分配大对象的步骤
1 | 1. 获取对象大小,检测对象大小 |
理解Golang的runtime
runtime是什么东西?
1 | 理解为Golang的基础设施 |
详细一点,runtime主要有什么功能
1 | 1. GC() 垃圾回收 |
理解goroutine泄漏
goroutine泄漏是什么?
1 | 结束goroutine有如下几种方法 |
举几个goroutine内存泄漏的例子
1 | 一般goroutine调度不当,才会出现内存泄漏 |
防治goroutine内存泄漏的几个方法
1 | 1. 信号控制goroutine,当创建goroutine的时候就要想着结束goroutine |
如何检查goroutine内存泄漏
1 | go pprof, 这个可以看一下我原来的blog |
链接在这里
Golang的一些常用标准库
os
1 | 操作系统功能的相关接口 |
time
1 | 时间相关处理 |
fmt
1 | 格式化操作 |
strconv
1 | 提供字符串与基本数据类型互转的能力 |
string
1 | 处理字符串的一些函数集合,包括合并、查找、分割、比较、后缀检查、索引、大小写处理等等。 |
http
1 | 提供web服务 |
context
1 | 上下文操作,我blog里有 |
sync
1 | 提供了基本的同步原语。在多个goroutine访问共享资源的时候,需要使用sync中提供的锁机制。 |
Golang的package包管理
Go modules管理
1 | 1. go.mod 文件,它与 package.json 或 Pipfile 文件的功能类似。 |
结尾
大概重要的地方都在这里了,我的基础还是稍稍偏差,不过我倒是觉得,学习嘛,不要停下来,每天进步一点点应该也就好了。
这周六我也要搬到新家去了
音乐工作室也搭建好了,买了电钢
编曲那套东西也都准备完毕了,希望我能做的更好吧
我希望我能越做越好。
1 | 将脚步停滞,生命静止 |