Go内存管理和GORM|青训营笔记

280 阅读1分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记。

内存管理

自动内存管理

保证内存使用的正确性和安全性

Mutator 业务线程 分配新对象,修改对象指向关系() Collector GC线程,找打存活对象,回收死亡对象的内存空间
Serial GC 单Collector
Parallel GC 多Collector 同时回收
Concurrent GC Mutator 和 Collector 可以并行执行

评估指标

安全性
吞吐量 非GC时间的比例
暂停时间 STW
内存开销

回收流程

  1. 标记根对象
  2. 找到可达对象
  3. 清理不可达对象
    标记清除
    标记移动
    复制

分代GC

很多对象很快就会死亡

引用计数

每个对象维护引用数目
内存管理操作平摊到程序执行中
缺点:
维护开销大:需要原子操作保证引用计数操作的原子性和可见性 无法回收环形数据 weak reference(可回收) 回收内存仍然引发暂停

Go 内存管理

分块

内存划分成大块 8KB mspan 再分成小块存储

缓存

Balanced GC

image.png 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