![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
笔记
文章平均质量分 59
hewesH
coding fitting and love.
展开
-
Go的垃圾回收
V1.3标记清除+STW,这个比较好理解,就不详细阐述了。V1.5提出了三色标记法,伴随有STW新生的对象都会标记成白色,然后从根节点出发一次遍历,将遍历过的对象标记成灰色的,并且全局变量和栈中的对象置灰色。最后将灰色对象标记为黑色,直到没有灰色对象全部转换成黑色对象为止。将所有的白色对象全部回收。假设没有STW,在标记过程中很有可能出现引用关系的改变。一旦改变了这个关系(尤其是黑色对象直接指向白色对象),就会出现“误删除”的操作。上述情况只针对于下面两个条件:一个白色对象被黑色对象引用(原创 2022-05-21 20:08:16 · 349 阅读 · 1 评论 -
redis持久化之AOF
AOF持久化将redis服务器所执行的写命令来记录数据库状态,并保存到AOF文件中。1. 持久化的实现命令追加服务器在执行完一个写命令之后,该命令会被追加到服务器状态的aof_buf缓冲区的末尾 struct redisServer { // AOF缓冲区 sds aof_buf; }写入与同步服务器在结束一个事件循环之前,会调用flushAppendOnlyFile来判断是否要将aof_buf缓冲区的内容写入AOF文件中,根据不同的appendfsync实现不同的原创 2022-05-10 13:06:15 · 276 阅读 · 0 评论 -
redis持久化之RDB快照
redis持久化之RDBRDB二进制文件用于还原数据库1. RDB文件的创建和载入SAVE命令会阻塞redis的其他进程来创建RDB文件,期间会拒绝所有命令请求;而BGSAVE则会创建一个子进程,由子进程负责创建RDB文件,而父进程继续执行服务器接受的命令请求。在执行BGSAVE命令期间,服务器会拒绝SAVE命令,原因是为了避免父进程和子进程同时执行rdbSave调用,防止产生竞争条件;同样也会拒绝BGSAVE操作;假设正在执行BGSAVE,客户端发送BGREWRITEAOF命令,那么该命令原创 2022-05-10 09:37:44 · 427 阅读 · 0 评论 -
Go 内存逃逸分享
内存逃逸是指编译器决定内存分配的位置,不需要程序员指定。在函数中申请一个新的对象:如果分配在栈中,则函数执行结束后可自动将内存回收;如果分配在堆中,则函数结束后需要交给GC进行处理。逃逸策略在函数中申请新的对象时,编译器会根据该对象是否被函数外部引用来决定是否逃逸:1. 函数外面没有引用,则优先放到栈中;2. 函数外部存在引用,则必定放到堆中。逃逸场景1)指针逃逸函数返回局部变量指针,函数内部定义的指针变量原本是在栈空间中开辟,但是函数将此局部变量返回出去了,那么指向该变量的原创 2022-04-29 22:55:15 · 293 阅读 · 0 评论 -
Go defer原理分析
defer用于延迟函数的调用,常用于关闭文件或者关闭锁的场景。defer语句采用类似栈的方式,每遇到一个defer就会把defer后面的函数压入栈中,在函数返回前再把栈中的函数依次取出执行。一般函数正常返回时会执行被defer延迟的函数,特别的遇到return和panic时也会触发延迟函数。defer作用于资源释放(关闭文件句柄、数据库连接、停止定时器ticker以及关闭管道)、流程控制(控制函数执行顺序,如wait.Group)和异常处理(recover()),但是defer关键字只能作用于函数或原创 2022-04-21 16:05:56 · 312 阅读 · 0 评论 -
Go map底层原理分析
mapGo的map底层是用hash表实现的。支持字面量初始化和内置函数make初始化。 m := map[string]int{"apple" : 2,"banana" : 3,} m := make(map[string]int, 10)make初始化map时指定容量可以有效减少内存分配的次数,有利于提升性能。map的增删改查操作 m := make(map[string]string, 10) m["apple"] = "red" m["apple"] = "green" dele原创 2022-04-19 22:22:44 · 980 阅读 · 0 评论 -
Go GMP模型原理分析
GMP模型G: goroutine 表示Go协程,每一个Go关键字都会创建一个协程.M: machine 表示工作线程,有操作系统调度.P: processor 表示处理器,包括运行Go代码的必要资源,以及调度goroutine的能力。M必须持有P才可以执行代码,M会被系统调用阻塞。P的个数在程序启动时决定,默认等于CPU数量。M的个数通常稍大于P,因为除了运行Go代码,runtime包还有其他内置任务需要处理。在I/O密集型应用中,可以将GOMAXPROCS设置得大一些。上图是协程从创建到原创 2022-04-18 21:30:54 · 345 阅读 · 0 评论 -
Go goroutine原理分析
协程进程的概念:是资源调度的基本单位,是应用程序的启动实例,每个进程都有独立的内存空间,不同进程通过进程间的通信方式来通信。(方式有管道pipe、命名管道FIFO、消息队列MQ、信号量semaphore、共享内存shared memory、信号signal、内存映射mapped memory和Socket)线程的概念:是程序执行的基本单位,线程从属于进程,每个进程至少包含一个线程,线程是CPU调度的基本单位,多个线程之间可以共享进程的资源并通过线程间的通信方式来通信。(方式有信号、锁机制、条件变量和信原创 2022-04-18 10:40:18 · 155 阅读 · 0 评论 -
Go slice原理分析
slice原理分析slice也称动态数组 make格式创建 s1 := make([]int,12) // 指定长度 s2 := make([]int,10,100) // 指定长度len和容量cap 字面量形式 s3 := []int{} // 需要注意空切片其值不是nil s4 := []int{1,2,3} // 长度为3的切片 从数组或者切片中截取切片 arr := [5]int{1, 2, 3, 4, 5} s5 := arr[0:2] // 左闭右开 s6 := s5[0:原创 2022-04-17 15:51:41 · 342 阅读 · 0 评论 -
Go channel原理分析
channel原理分析数据结构 type hchan struct { qcount uint // 当前队列中剩余的元素个数 dataqsiz uint // 环形队列的长度,即为缓冲区的大小 buf unsafe.Pointer // 指向环形队列的指针 elemsize uint16 // 管道中元素的大小 closed uint32 // 管道是否关闭 elemtype *_type原创 2022-04-17 12:46:59 · 302 阅读 · 0 评论 -
推荐一本动态规划启蒙书
算法图解动态规划在第九章,建议多看几遍原创 2021-12-19 23:33:34 · 336 阅读 · 0 评论