这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记。
内存管理
自动内存管理
保证内存使用的正确性和安全性
Mutator 业务线程 分配新对象,修改对象指向关系()
Collector GC线程,找打存活对象,回收死亡对象的内存空间
Serial GC 单Collector
Parallel GC 多Collector 同时回收
Concurrent GC Mutator 和 Collector 可以并行执行
评估指标
安全性
吞吐量 非GC时间的比例
暂停时间 STW
内存开销
回收流程
- 标记根对象
- 找到可达对象
- 清理不可达对象
标记清除
标记移动
复制
分代GC
很多对象很快就会死亡
引用计数
每个对象维护引用数目
内存管理操作平摊到程序执行中
缺点:
维护开销大:需要原子操作保证引用计数操作的原子性和可见性
无法回收环形数据 weak reference(可回收)
回收内存仍然引发暂停
Go 内存管理
分块
内存划分成大块 8KB mspan 再分成小块存储
缓存
Balanced GC
goroutine allocation buffer
GAB 分配noscan的小对象 < 128 B
大小
GAB base top end
top到end 每一个g私有
指针碰撞 对象分配
GAB copy
编译流程
静态分析
分析代码的控制流 考虑过程调用间的数据流和控制流
import ( "database/sql" "time"
_ "github.com/go-sql-driver/mysql"
)
// import driver 使用driver和DSN初始化DB连接 db, err := sql.Open("mysql", "user:password@/dbname") if err != nil { panic(err) } // See "Important settings" section. db.SetConnMaxLifetime(time.Minute * 3) db.SetMaxOpenConns(10) db.SetMaxIdleConns(10)
scan返回的err rows.Err() driver 数据库 连接接口 操作接口 Result
GORM 设计简洁、功能强大、自由扩展的全功能ORM
ORM 使得数据库输出成结构体形式
关联操作 preload/joins 预加载
preload分多条实现 joins
级联删除 数据库约束
GORM设计原理
SQL生成
插件扩展
ConnPool
Dialector
应用程序->GORM-database/sql->数据库
GORM Clauses SLECT Statement