美文网首页
go内存管理相关

go内存管理相关

作者: mafa1993 | 来源:发表于2022-11-06 20:21 被阅读0次

内存管理

堆内存使用

  1. 会将使用的内存形成一个链表,内存使用结束以后,会标记成unuse,垃圾回收就会扫描整个链表,进行清理
  2. 内存管理可能存在的问题
    • 频繁内存分配的收,系统性能降低
    • 多线程共享内存空间,同时申请内存需要加锁,否则会产生多个线程访问同一个内存的问题
    • 内存碎片的问题,经过不断的内存分配回收,内存变得不连续
  3. thteadcachemalloc(tcMalloc)解决上述问题
    • 每个线程有单独的内存空间,从而解决多线程内存申请需要加锁的问题(threadcache)
    • threadCache中没有空间以后,会从CentralCache中获取,在centralCache中获取内存需要加锁
    • 然后是pageHeap,pageheap里是一个个Span list,span list是一个个的8k大小的内存页
    • sizeclass,空间规格,每个span都带有一个sizeclass,标记每个span如何使用

go内存分配

  1. 基于tcmalloc,span class 134个,size class67个,sapn class一个带指针,一个不带,便于回收
  2. free树,未进行分配的内存树
  3. mcav树,会瘦回来的内存树

内存回收

  1. 引用计数(php、py、swift),对每个对象维护一个引用计数,销毁时回收,不好处理循环引用
  2. 标记删除(go),从根变量开始遍历所有的引用对象,引用的标记为引用,没被标记的进行回收,缺点是需要暂停程序回收时
  3. 分代回收,java

mspan

  1. mspan记录了起始地址等
  2. allocBits,bitmap记录了每块内存的分配情况,被分配的标记成1
  3. gcmarkBits,记录了每块内存的引用情况,有对象引用的标记为1,没有的为0,通过这个两个bitmap,可以实现快速的内存回收

gc流程

  1. 大部分处理是和用户代码并行的
  2. Mark
    • Mark Prepare:初始化gc任务,包括开启写屏障和辅助GC,统计root的任务数量等,整个过程需要STW(程序停止)
    • GC Drains,扫描所有root对象,包括全局指针和goroutine栈上的指针(扫描哪个停止哪个协程),将其加入标记队列,并循环处理灰色队列的对象,直到灰色队列为空
  3. Mark Termination:完成标记工作,重新扫描全局指针和栈,mark阶段有一部分工作是和协程并行的,可能会有新的空余内存产生,通过写屏障记录,然后重新扫描下,这个过程会stw
  4. sweep:按照标记结果回收白色对象,后台并行
  5. sweep Termination:对为清扫的span进行清扫,只有上一轮的GC清扫完成才可以开始

三色标记法

  1. gc开始时,都是白色
  2. 将扫描到未判定的标记为灰色(在队列中,等待判定的)
  3. 遍历所有的灰色,将扫到的下一级置为灰色,自身为黑色
  4. 直到没有灰色的,黑色就为非垃圾,白色为垃圾

垃圾回收实际

  1. 内存分配量达到阈值gc
  2. 定期触发,默认2分钟,在src/runtime/proc.go forcegcperiod声明
  3. 手动触发 程序中使用runtiome.GC() 手动触发

相关文章

  • go内存管理相关

    内存管理 堆内存使用 会将使用的内存形成一个链表,内存使用结束以后,会标记成unuse,垃圾回收就会扫描整个链表,...

  • Go语言——内存管理

    Go语言——内存管理 参考: 图解 TCMalloc Golang 内存管理 Go 内存管理 问题 内存碎片:避免...

  • Go的内存管理

    本文翻译自Memory Management in Go,介绍了Go语言中内存管理的相关概念。 所有的计算机程序语...

  • 内存管理相关

    引文: 多线程相关 OC 语言相关 内存管理相关 UI视图相关 RunLoop相关 内存布局 内存管理方案 数据结...

  • 图解 Go 内存管理器的内存分配策略

    关于Go的内存分配 在 Go 语言里,从内存的分配到不再使用后内存的回收等等这些内存管理工作都是由 Go 在底层完...

  • go 内存模型简要说明

    go 内存模型 大体上来说go的内存是先申请一大片内存,然后将内存分为各个小的span来管理,因为每个go对象有对...

  • Go 语言内存管理(二):Go 内存管理

    介绍 了解操作系统对内存的管理机制后,现在可以去看下 Go 语言是如何利用底层的这些特性来优化内存的。Go 的内存...

  • Go内存管理源码浅析

    前一篇讲了Go的调度机制和相关源码,这里说一下内存的管理,代码片段也都是基于Go 1.12。 简要的背景 一个程序...

  • Go 语言内存管理(一):系统内存管理

    介绍 要搞明白 Go 语言的内存管理,就必须先理解操作系统以及机器硬件是如何管理内存的。因为 Go 语言的内部机制...

  • go内存管理

    1. Go 内存的划分 强烈推荐参考链接 在讲Go的堆栈之前,先温习一下堆栈基础知识。 什么是堆栈?在计算机中堆栈...

网友评论

      本文标题:go内存管理相关

      本文链接:https://www.haomeiwen.com/subject/foritdtx.html