go逃逸分析go 内存分配go 内存详细过程参考这篇: go内存分配与垃圾回收 go 会在堆(heap, 全局的堆空间用来动态分配内存)和栈(每个 goroutine 的 stack)两个地方分配内存。在函数中申请一个对象,如果分配在栈中,函数执行结束时自动回收,如果分配在堆中,则在函数结束后某个时间点进行垃圾回收。 在栈上分配和回收内存的开销很低,只需要 2 个 CPU 指令:PUSH 和 POP,一个是将 2025-05-15 go
go-channel底层原理前言go channel 是 go 并发最核心的组件, 也体现 go 的并发思想: Do not communicate by sharing memory; instead, share memory by communicating. chanel 分为两类: 无缓冲channel,可以看作“同步模式”,发送方和接收方要同步就绪,只有在两者都 ready 的情况下,数据才能在两者间传输( 2025-04-30 go #go-channel
go锁mutex与RWMutexsync.Mutexsync.Mutex 是 go 最基本的同步原语, 也是最常用的锁之一 基本结构12345// sync/mutex.go 25行type Mutex struct { state int32 sema uint32} state: 当前互斥锁的状态 sema: 控制锁状态信号量 state 一共32位, 最低三位分别表示 mutexLocked、mu 2024-12-12 go
使用redis作为延迟队列方案对比背景项目中经常需要做某个操作, 然后一定时间之后看这个操作的执行结果。 要么使用定时任务扫描, 要么使用延时队列(任务)来实现。在主流的 MQ 中支持延时消息的有 RabbitMQ 和 RocketMQ, 如果没有使用这个两个 MQ, 譬如使用了 Kafka, 又想使用延时消息的功能可以使用 Redis来实现。 Redis 实现延时队列有三种方案: 基于 Zset(Sorted Set) 来实现 2024-11-12 中间件 #redis
go内存分配与垃圾回收go 内存管理基本概念go 与 java类似, 都实现了自动内存管理。 Golang运行时的内存分配算法主要是 TCMalloc算法。核心思想就是把内存分为多级管理,从而降低锁的粒度。它将可用的堆内存采用二级分配的方式进行管理:每个线程都会自行维护一个独立的内存池,进行内存分配时优先从该内存池中分配,当内存池不足时才会向全局内存池申请,以避免不同线程对全局内存池的频繁竞争。 基本概念 Page 2024-10-14 go
unsafe.Pointer与uintptruintptr 一个足够大的无符号整型,用来表示内存地址的值,比如 0xffffffff 可以进行地址的数值计算 uintptr 可以和 int、int8、int32、uint8 等整型类型相互转换 使用示例: 12345678910func main() { var i int = 1 fmt.Println(uintptr(i)) fmt.Println(uint 2024-10-11 go
go map 原理与并发安全mapmap 原理go map 整体和 java hashmap 差不多, 只是源码阅读的位置不太方便 map 的相关文件位于 GOROOT 的 runtime 包中的 map.go map 结构hmap12345678910111213141516171819202122232425// A header for a Go map.type hmap struct { // map中的 2024-10-09 go
MySQ之onlineDDLDDL 的算法copyCOPY是MYSQL 5.5以及之前的默认算法,使用COPY算法会锁表,不支持online ddl,COPY算法在server层创建一个临时表用于copy数据,最后用新表替换旧表。 copy 算法的执行执行流程: 准备: 对表加 DML 读锁,读取元数据(DDL不并行,DML可以并行) 升级 DML 写锁(DDL和DML都不并行) 按照原表定义创建一个新的临时表 执行 2024-08-08 mysql #mysql