海安零距离 海安论坛 海安新闻 海安

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2675|回复: 0

golang内存分配

[复制链接]

6234

主题

6234

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
18718
发表于 2019-12-27 15:20 | 显示全部楼层 |阅读模式
  Go语言内置运行时(就是runtime),差别于传统的内存分配方式,go为自主管理,最开始是基于tcmalloc架构,背面徐徐迭新。自主管理可实现更好的内存利用模式,如内存池、预分配等,从而克制了体系调用所带来的性能标题。
1. 根本计谋


  • 每次从操纵体系申请一大块内存,然后将其按特定巨细分成小块,构成链表(构造方式是一个单链表数组,数组的每个元素是一个单链表,链表中的每个元素具有相同的巨细。);
  • 为对象分配内存时从巨细符合的链表提取一小块,克制每次都向操纵体系申请内存,减少体系调用。
  • 接纳对象内存时将该小块重新归还到原链表,以便复用;若闲置内存过多,则归还部门内存到操纵体系,低落团体开销。
1.1 内存块

  span:即上面所说的操纵体系分配的大块内存,由多个地址连续的页构成;
  object:由span按特定巨细切分的小块内存,每一个可存储一个对象;
  按照用途,span面向内部管理,object面向对象分配。
关于span

  内存分配器按照页数来区分差别巨细的span,如以页数为单位将span存放到管理数组中,且以页数作为索引;
  span巨细并非稳定,在没有获取到符合巨细的闲置span时,返回页数更多的span,然后举行剪裁,多余的页数构成新的span,放回管理数组;
  分配器还可以将相邻的空闲span归并,以构建更大的内存块,减少碎片提供更机动的分配计谋。
分配的内存块巨细

  在$GOROOT/src/runtime/malloc.go文件下可以找到相关信息。
  1. 1 //malloc.go2 _PageShift = 133 _PageSize  = 1> _PageShift) 8     startAddr uintptr  //address of first byte of span aka s.base() 9     npages    uintptr  //number of pages in span10 11     //待分配的object链表12     manualFreeList gclinkptr  //list of free objects in mSpanManual spans13 }
复制代码
  分配器初始化时,会构建对照表存储巨细和规格的对应关系,包罗用来切分的span页数。
[code] 1 //msize.go 2  3  // Malloc small size classes. 4  // 5  // See malloc.go for overview. 6  // See also mksizeclasses.go for how we decide what size classes to use. 7  8  package runtime 9 10  // 假如须要,返回mallocgc将分配的内存块的巨细。11  func roundupsize(size uintptr) uintptr {12      if size < _MaxSmallSize {13          if size =127)的闲置span链表                                                                                                                      4     largefree   uint64                  // bytes freed for large objects (>maxsmallsize)     5     nlargefree  uint64                  // number of frees for large objects (>maxsmallsize)  6     //页数在127以内的闲置span链表数组                                                                                                                      7     nsmallfree  [_NumSizeClasses]uint64 // number of frees for small objects (= 0; i-- { 46             var p uintptr 47             switch { 48             case GOARCH == "arm64" && GOOS == "darwin": 49                 p = uintptr(i)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|深圳论坛-深圳人的网上家园  

GMT+8, 2020-10-2 00:44 , Processed in 0.118489 second(s), 29 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表