[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-detail-ssr-65115486295165964":3},{"id":4,"title":5,"tag":6,"createTime":7,"updateTime":8,"renderedHtml":9,"description":10,"ogImageUrl":11},"65115486295165964","golang内存分配","Go语言","2024-03-25","2024-04-02","\u003Ch2 id=\"h2-0-\">内存分配思想\u003C\u002Fh2>\n\u003Cp>程序中的数据和变量都会被分配到程序所在的虚拟内存中，内存空间包含两个重要区域：栈区（Stack）和堆区（Heap）。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>函数调用的参数、返回值以及局部变量基本上会被分配到栈上，这部分内存会由编译器进行管理；\u003C\u002Fli>\n\u003Cli>对于堆区内存，不同编程语言使用不同的方法管理堆区的内存。C++ 等编程语言会由使用者主动申请和释放内存，Go 以及 Java 等编程语言会由使用者和编译器共同管理，堆中的对象由内存分配器分配并由垃圾收集器回收。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Golang 的内存分配器借鉴了 TCMalloc 的思想，尽量减少在多线程模型下，锁的竞争开销，来提高内存分配的效率。\u003C\u002Fp>\n\u003Ch3 id=\"h3-1-tcmalloc\">TCMalloc\u003C\u002Fh3>\n\u003Cp>TCMalloc，其实就是 thread cache malloc 的缩写。看下图大概了解一下 TCMalloc 的思想。\u003C\u002Fp>\n\u003Cp>\u003Cimg class=\"article-img article-img-zoomable\" src=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251301700.png\" alt=\"\" loading=\"lazy\" decoding=\"async\" style=\"width: 100%; height: auto; max-width: 100%; display: block;\" srcset=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251301700.png?imageMogr2\u002Fthumbnail\u002F400x\u002Fformat\u002Fwebp\u002Fquality\u002F85 400w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251301700.png?imageMogr2\u002Fthumbnail\u002F800x\u002Fformat\u002Fwebp\u002Fquality\u002F85 800w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251301700.png?imageMogr2\u002Fthumbnail\u002F1200x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1200w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251301700.png?imageMogr2\u002Fthumbnail\u002F1920x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1920w\" sizes=\"(max-width: 576px) 100vw, (max-width: 992px) 90vw, 720px\">\u003C\u002Fp>\n\u003Cp>span 这个单词的直译是\u003Cstrong>跨度\u003C\u002Fstrong>的意思，在当前的语境下，可以理解为\u003Ccode>一段连续的内存\u003C\u002Fcode>。下面是一些名词解释：\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Ccode>PageHeap\u003C\u002Fcode>：这是 TCMalloc 中用于管理操作系统页面的部分。它负责较大的分配内存，通常以页（一般为 4KB）为单位。在 PageHeap 当中将多个页组合成 spans，因此 spans 可以是一个或多个连续的页。\u003C\u002Fli>\n\u003Cli>\u003Ccode>Span\u003C\u002Fcode>：一个 Span 是由 PageHeap 管理的连续页的集合。因此 Span 可以是单个页面，也可以是多个连续页面的组合。\u003C\u002Fli>\n\u003Cli>\u003Ccode>CentralCache\u003C\u002Fcode>：这是 TCMalloc 中的一个中心缓存，用于存放固定大小的内存块，这些内存块在不同大小的 size class 之间分组。中心缓存的作用是给所有的线程的 ThreadCache 分配内存，当某个线程中的内存不够时，向 CentralCache 申请内存时是需要加锁的。\u003C\u002Fli>\n\u003Cli>\u003Ccode>size class\u003C\u002Fcode>：为了高效地复用和分配内存，内存块被分为不同大小的 size class。每个 size class 包含大小相同的内存块，以满足不同大小的内存请求。\u003C\u002Fli>\n\u003Cli>\u003Ccode>ThreadCache\u003C\u002Fcode>：这是 TCMalloc 中为每个线程分配的本地缓存，用于提供快速的内存分配。当一个线程需要分配内存时，它首先尝试从其 ThreadCache 中获取内存，由于是从本地线程申请内存，所以申请内存时不需要加锁。\u003C\u002Fli>\n\u003Cli>\u003Ccode>Application\u003C\u002Fcode>：应用程序，它是内存分配的终端用户，会从 TCMalloc 请求内存来满足其运行需要。\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>基于 TCMalloc 思想进行内存分配的过程通常如下：\u003C\u002Fp>\n\u003Col>\n\u003Cli>当应用程序请求分配内存时，它首先检查本地线程的\u003Ccode>ThreadCache\u003C\u002Fcode>中是否有适当大小的内存块。如果有，则直接分配，这是最快的途径。\u003C\u002Fli>\n\u003Cli>如果线程的\u003Ccode>ThreadCache\u003C\u002Fcode>没有可用的内存块，则尝试从\u003Ccode>CentralCache\u003C\u002Fcode>中获取内存。\u003Ccode>CentralCache\u003C\u002Fcode>中的内存块是预先按\u003Ccode>size class\u003C\u002Fcode>分类的。\u003C\u002Fli>\n\u003Cli>如果\u003Ccode>CentralCache\u003C\u002Fcode>中也没有可用的内存块，则从\u003Ccode>PageHeap\u003C\u002Fcode>中分配一个或多个页面，这会形成一个新的\u003Ccode>Span\u003C\u002Fcode>，然后将其放入\u003Ccode>CentralCache\u003C\u002Fcode>。\u003C\u002Fli>\n\u003Cli>在需要释放内存时，内存块会被放回到对应线程的\u003Ccode>ThreadCache\u003C\u002Fcode>。如果\u003Ccode>ThreadCache\u003C\u002Fcode>已满，它会被移动到\u003Ccode>CentralCache\u003C\u002Fcode>，并可能最终返回到\u003Ccode>PageHeap\u003C\u002Fcode>以供将来使用。\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>这就是基于 TCMalloc 思想进行内存分配的大致流程。总的来说，就是先向操作系统申请一大块内存，然后再对这一大块内存进行瓜分，分别分配给 PageHeap、CentralCache 和 ThreadCache。应用程序需要内存的时候就向上级申请，上级内存不够就向上上级申请，上上级不够就向上上上级申请。由于向本地的线程的 ThreadCache 申请内存时无需加锁，所以这让内存分配的效率有了一定的提升。\u003C\u002Fp>\n\u003Ch2 id=\"h2-2-\">内存分配对象的划分\u003C\u002Fh2>\n\u003Cp>golang 根据对象大小将它们分成微对象、小对象和大对象，并且会根据对象大小的不同选择不同的内存分配方案。不同大小对象的划分规则如下：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>微对象 \u003Ccode>(0, 16B)\u003C\u002Fcode> ：先使用微型分配器，再依次尝试线程缓存、中心缓存和堆分配内存；\u003C\u002Fli>\n\u003Cli>小对象 \u003Ccode>[16B, 32KB]\u003C\u002Fcode>：依次尝试使用线程缓存、中心缓存和堆分配内存；\u003C\u002Fli>\n\u003Cli>大对象 \u003Ccode>(32KB, +∞)\u003C\u002Fcode>：直接在堆上分配内存；\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"h2-3-go-\">Go 内存管理组件\u003C\u002Fh2>\n\u003Cp>Go 语言的内存分配器包含\u003Ccode>内存管理单元\u003C\u002Fcode>、\u003Ccode>线程缓存\u003C\u002Fcode>、\u003Ccode>中心缓存\u003C\u002Fcode>和\u003Ccode>页堆\u003C\u002Fcode>几个重要组件，接下来将介绍这几种最重要组件对应的数据结构 \u003Ccode>mspan\u003C\u002Fcode>、\u003Ccode>mcache\u003C\u002Fcode>、\u003Ccode>mcentral\u003C\u002Fcode> 和 \u003Ccode>mheap\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Cimg class=\"article-img article-img-zoomable\" src=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251301803.png\" style=\"zoom: 65%;\" \u002F loading=\"lazy\" decoding=\"async\" srcset=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251301803.png?imageMogr2\u002Fthumbnail\u002F400x\u002Fformat\u002Fwebp\u002Fquality\u002F85 400w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251301803.png?imageMogr2\u002Fthumbnail\u002F800x\u002Fformat\u002Fwebp\u002Fquality\u002F85 800w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251301803.png?imageMogr2\u002Fthumbnail\u002F1200x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1200w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251301803.png?imageMogr2\u002Fthumbnail\u002F1920x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1920w\" sizes=\"(max-width: 576px) 100vw, (max-width: 992px) 90vw, 720px\">\n\u003Cp>所有的 Go 语言程序都会在启动时初始化如上图所示的内存布局，每一个处理器（P）都会分配一个线程缓存 \u003Ccode>mcache\u003C\u002Fcode> 用于处理微对象和小对象的分配，它们会持有内存管理单元 \u003Ccode>mspan\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Ch3 id=\"h3-4-mspan\">内存管理单元:mspan\u003C\u002Fh3>\n\u003Cp>\u003Ccode>mspan\u003C\u002Fcode>是 Go 语言\u003Ccode>内存管理的基本单元\u003C\u002Fcode>。每个 mspan 都对应一个大小等级，总共 67 个等级。mspan 结构体中包含 \u003Ccode>next\u003C\u002Fcode> 和 \u003Ccode>prev\u003C\u002Fcode> 两个字段，它们分别指向了前一个和后一个 mspan：\u003C\u002Fp>\n\u003Cdiv class=\"ssr-code-block\" data-lang=\"go\">\u003Cdiv class=\"ssr-code-head\">\u003Cspan class=\"ssr-code-lang\">go\u003C\u002Fspan>\u003Cdiv class=\"ssr-code-actions\">\u003Cbutton class=\"ssr-code-fullscreen ssr-code-iconbtn\" type=\"button\" aria-label=\"全屏查看代码\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cbutton class=\"ssr-code-copy ssr-code-iconbtn\" type=\"button\" aria-label=\"复制代码\" title=\"复制\">\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--default\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--success\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--error\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"ssr-code-body\">\u003Cdiv class=\"ssr-code-pane\">\u003Cdiv class=\"ssr-code-gutter\" aria-hidden=\"true\">\u003Cspan class=\"ssr-code-num\">1\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">2\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">3\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">4\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">5\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">6\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">7\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">8\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">9\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">10\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">11\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">12\u003C\u002Fspan>\u003C\u002Fdiv>\u003Cpre class=\"ssr-code-pre\">\u003Ccode class=\"hljs language-go\">\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#6A737D\">\u002F\u002F src\\runtime\\mheap.go\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#F97583\">type\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">mspan\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">struct\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> {\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">    next \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">*\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">mspan\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">    prev \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">*\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">mspan\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">    list \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">*\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">mSpanList\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">    \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">...\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">​\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#F97583\">type\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">mSpanList\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">struct\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> {\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">    first \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">*\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">mspan\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">    last  \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">*\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">mspan\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Cp>mspan 串联后会构成如下双向链表，运行时会使用 mSpanList 存储双向链表的头节点和尾节点，并在 mcache 以及 mcentral 中使用。\u003C\u002Fp>\n\u003Cp>\u003Cimg class=\"article-img article-img-zoomable\" src=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251301283.png\" alt=\"image-20240324203132837\" loading=\"lazy\" decoding=\"async\" style=\"width: 100%; height: auto; max-width: 100%; display: block;\" srcset=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251301283.png?imageMogr2\u002Fthumbnail\u002F400x\u002Fformat\u002Fwebp\u002Fquality\u002F85 400w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251301283.png?imageMogr2\u002Fthumbnail\u002F800x\u002Fformat\u002Fwebp\u002Fquality\u002F85 800w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251301283.png?imageMogr2\u002Fthumbnail\u002F1200x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1200w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251301283.png?imageMogr2\u002Fthumbnail\u002F1920x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1920w\" sizes=\"(max-width: 576px) 100vw, (max-width: 992px) 90vw, 720px\">\u003C\u002Fp>\n\u003Ch4 id=\"h4-5-\">页\u003C\u002Fh4>\n\u003Cp>每个 \u003Ccode>mspan\u003C\u002Fcode> 都管理 \u003Ccode>npages\u003C\u002Fcode> 个大小为 8KB 的页，这里的页不是操作系统中的内存页，它们是操作系统内存页（一般是 4KB）的整数倍，mspan 会使用下面这些字段来管理内存页的分配和回收：\u003C\u002Fp>\n\u003Cdiv class=\"ssr-code-block\" data-lang=\"go\">\u003Cdiv class=\"ssr-code-head\">\u003Cspan class=\"ssr-code-lang\">go\u003C\u002Fspan>\u003Cdiv class=\"ssr-code-actions\">\u003Cbutton class=\"ssr-code-fullscreen ssr-code-iconbtn\" type=\"button\" aria-label=\"全屏查看代码\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cbutton class=\"ssr-code-copy ssr-code-iconbtn\" type=\"button\" aria-label=\"复制代码\" title=\"复制\">\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--default\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--success\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--error\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"ssr-code-body\">\u003Cdiv class=\"ssr-code-pane\">\u003Cdiv class=\"ssr-code-gutter\" aria-hidden=\"true\">\u003Cspan class=\"ssr-code-num\">1\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">2\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">3\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">4\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">5\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">6\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">7\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">8\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">9\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">10\u003C\u002Fspan>\u003C\u002Fdiv>\u003Cpre class=\"ssr-code-pre\">\u003Ccode class=\"hljs language-go\">\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#F97583\">type\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">mspan\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">struct\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> {\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">    startAddr \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">uintptr\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#6A737D\">\u002F\u002F 起始地址\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">    npages    \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">uintptr\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#6A737D\">\u002F\u002F 页数\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">    freeindex \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">uintptr\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">​\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">    allocBits  \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">*\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">gcBits\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">    gcmarkBits \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">*\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">gcBits\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">    allocCache \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">uint64\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">    \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">...\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Ccode>startAddr\u003C\u002Fcode> 和 \u003Ccode>npages\u003C\u002Fcode>：确定 mspan 管理的多个页所在的内存，每个页的大小都是 8KB。知道了内存的起始地址、每页的大小和数量就能确定 mspan 所管理的一段连续内存所在的区域；\u003C\u002Fli>\n\u003Cli>\u003Ccode>freeindex\u003C\u002Fcode>：是一个索引，指示从哪个位置开始查找下一个空闲对象。这个索引可以加速内存分配过程，因为分配器知道无需从头开始检查内存块；\u003C\u002Fli>\n\u003Cli>\u003Ccode>allocBits\u003C\u002Fcode>：一个位图，用于表示 \u003Ccode>mspan\u003C\u002Fcode> 管理的内存中的对象是否已经被分配。如果相应的位被设置为 1，说明对应的对象已经被分配，如果是 0，则对象空闲；\u003C\u002Fli>\n\u003Cli>\u003Ccode>gcmarkBits\u003C\u002Fcode>：也是一个位图，用于垃圾回收过程中标记对象是否可以访问（即是否被 “标记”）。在垃圾回收时，这些位用来决定哪些对象应该被回收；\u003C\u002Fli>\n\u003Cli>\u003Ccode>allocCache\u003C\u002Fcode>：allocBits 的补码，可以用于快速查找内存中未被使用的内存；\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cimg class=\"article-img article-img-zoomable\" src=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300443.png\" alt=\"image-20240324211550416\" loading=\"lazy\" decoding=\"async\" style=\"width: 100%; height: auto; max-width: 100%; display: block;\" srcset=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300443.png?imageMogr2\u002Fthumbnail\u002F400x\u002Fformat\u002Fwebp\u002Fquality\u002F85 400w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300443.png?imageMogr2\u002Fthumbnail\u002F800x\u002Fformat\u002Fwebp\u002Fquality\u002F85 800w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300443.png?imageMogr2\u002Fthumbnail\u002F1200x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1200w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300443.png?imageMogr2\u002Fthumbnail\u002F1920x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1920w\" sizes=\"(max-width: 576px) 100vw, (max-width: 992px) 90vw, 720px\">\u003C\u002Fp>\n\u003Cp>所以，当程序中的某个对象需要申请内存时，内存分配器会在相应大小的 \u003Ccode>mspan\u003C\u002Fcode>中根据相应的字段查找空余的空间来分配给这些对象。\u003C\u002Fp>\n\u003Ch4 id=\"h4-6-\">跨度类\u003C\u002Fh4>\n\u003Cp>\u003Ccode>spanClass\u003C\u002Fcode> 是 mspan 的跨度类，它决定了内存管理单元中存储的对象大小和个数。这么讲可能有点抽象，通俗一点就是：mspan 这个内存管理单元是分不同大小的，有小一点的 mspan，也有大一点的 mspan，为了区分这些不同的 mspan，需要用一个唯一的 ID 去标识不同的 mspan，这个 ID 就是跨度类。\u003C\u002Fp>\n\u003Cdiv class=\"ssr-code-block\" data-lang=\"go\">\u003Cdiv class=\"ssr-code-head\">\u003Cspan class=\"ssr-code-lang\">go\u003C\u002Fspan>\u003Cdiv class=\"ssr-code-actions\">\u003Cbutton class=\"ssr-code-fullscreen ssr-code-iconbtn\" type=\"button\" aria-label=\"全屏查看代码\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cbutton class=\"ssr-code-copy ssr-code-iconbtn\" type=\"button\" aria-label=\"复制代码\" title=\"复制\">\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--default\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--success\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--error\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"ssr-code-body\">\u003Cdiv class=\"ssr-code-pane\">\u003Cdiv class=\"ssr-code-gutter\" aria-hidden=\"true\">\u003Cspan class=\"ssr-code-num\">1\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">2\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">3\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">4\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">5\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">6\u003C\u002Fspan>\u003C\u002Fdiv>\u003Cpre class=\"ssr-code-pre\">\u003Ccode class=\"hljs language-go\">\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#F97583\">type\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">mspan\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">struct\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> {\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">    spanclass   \u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">spanClass\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">    \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">...\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">​\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#F97583\">type\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">spanClass\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">uint8\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Cp>Go 语言的内存管理模块中一共包含 67 种跨度类，每一个跨度类都会存储特定大小的对象，并且包含特定数量的页数和对象。67 种跨度类是从 8B 到 32KB，具体的详细信息可以在 go 源码中找到（src\\runtime\\sizeclasses.go）。下面是一张简化版的表：\u003C\u002Fp>\n\u003Cimg class=\"article-img article-img-zoomable\" src=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300352.png\" style=\"zoom:67%;\" \u002F loading=\"lazy\" decoding=\"async\" srcset=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300352.png?imageMogr2\u002Fthumbnail\u002F400x\u002Fformat\u002Fwebp\u002Fquality\u002F85 400w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300352.png?imageMogr2\u002Fthumbnail\u002F800x\u002Fformat\u002Fwebp\u002Fquality\u002F85 800w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300352.png?imageMogr2\u002Fthumbnail\u002F1200x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1200w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300352.png?imageMogr2\u002Fthumbnail\u002F1920x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1920w\" sizes=\"(max-width: 576px) 100vw, (max-width: 992px) 90vw, 720px\">\n\u003Cp>下面是各个列的含义：\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Ccode>class\u003C\u002Fcode>：可以认为是跨度类的 ID；\u003C\u002Fli>\n\u003Cli>\u003Ccode>bytes\u002Fobj\u003C\u002Fcode>：一次对外提供的内存大小。比如程序需要申请一个 40 字节的对象，内存分配器分不会分配 40 字节的内存，而是分配 48 字节的内存。\u003C\u002Fli>\n\u003Cli>\u003Ccode>bytes\u002Fspan\u003C\u002Fcode>：当前的跨度类所对应的 mspan 的大小。\u003C\u002Fli>\n\u003Cli>\u003Ccode>objects\u003C\u002Fcode>：当前 mspan 一共能存放的对象的个数。以 class=7 为例，mspan 的大小为 8192，那么 8192 \u002F 80=102.4，也就是当前的 mspan 可以放下 102 个大小为 80 字节的对象。\u003C\u002Fli>\n\u003Cli>\u003Ccode>tail waste\u003C\u002Fcode>：mspan 放满后的浪费内存。\u003C\u002Fli>\n\u003Cli>\u003Ccode>max waste\u003C\u002Fcode>：最大可能浪费的空间所占百分比。还是以 class=7 为例，如果每个分配的对象都是 65 字节（上一档位的 obj size + 1），那么分配 102 后总共浪费的内存就是：(80 - 65) \u003Cspan class=\"katex\">\u003Cspan class=\"katex-html\" aria-hidden=\"true\">\u003Cspan class=\"base\">\u003Cspan class=\"strut\" style=\"height:0.6667em;vertical-align:-0.0833em;\">\u003C\u002Fspan>\u003Cspan class=\"mord\">×\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan> 102 + 32 = 1562字节，浪费的内存占比就是(1562 \u002F 8192) \u003Cspan class=\"katex\">\u003Cspan class=\"katex-html\" aria-hidden=\"true\">\u003Cspan class=\"base\">\u003Cspan class=\"strut\" style=\"height:0.6667em;vertical-align:-0.0833em;\">\u003C\u002Fspan>\u003Cspan class=\"mord\">×\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan> 100%=19.07%\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cblockquote>\n\u003Cp>\u003Cstrong>关于 mspan 的总结\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Col>\n\u003Cli>mspan 按照大小进行分类共有 67 种，这 67 个 mspan 通过双向链表进行连接。\u003C\u002Fli>\n\u003Cli>每一种 mspan 都是由一个或多个 8KB 的页组成的一段连续的内存。\u003C\u002Fli>\n\u003Cli>对于每一种 mspan，都有与之对应的对象（obj）的大小。当应用程序需要申请内存时，根据申请内存的大小来找到对应的 mspan，然后通过 mspan 上记录的一些字段值来进行扫描，到扫描到空闲对象的时候，就把该对象对应的内存空间分配给应用程序。\u003C\u002Fli>\n\u003C\u002Fol>\n\u003C\u002Fblockquote>\n\u003Ch3 id=\"h3-7-mcache\">线程缓存:mcache\u003C\u002Fh3>\n\u003Cp>\u003Ccode>mcache\u003C\u002Fcode>是与 Go 协程调度模型 GMP 中的 P（调度器）所绑定，而不是和线程 M 绑定，因为在 Go 调度的 GMP 模型中，真正可运行的线程 M 的数量与 P 的数量一致，即 GOMAXPROCS 个，跟 P 绑定节省了 P 移动到其他 M 上去的 mcahe 的切换开销。每个线程分配一个 mcache 用于处理微对象和小对象的分配。因为是每个线程独有的，所以不需要加锁申请内存。\u003C\u002Fp>\n\u003Cimg class=\"article-img article-img-zoomable\" src=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300041.png\" alt=\"image-20240325111409933\" style=\"zoom:67%;\" \u002F loading=\"lazy\" decoding=\"async\" srcset=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300041.png?imageMogr2\u002Fthumbnail\u002F400x\u002Fformat\u002Fwebp\u002Fquality\u002F85 400w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300041.png?imageMogr2\u002Fthumbnail\u002F800x\u002Fformat\u002Fwebp\u002Fquality\u002F85 800w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300041.png?imageMogr2\u002Fthumbnail\u002F1200x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1200w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300041.png?imageMogr2\u002Fthumbnail\u002F1920x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1920w\" sizes=\"(max-width: 576px) 100vw, (max-width: 992px) 90vw, 720px\">\n\u003Cp>\u003Ccode>mcache\u003C\u002Fcode>在刚刚被初始化时是不包含 mspan 的，只有当用户程序申请内存时才会从上一级组件获取新的 mspan 满足内存分配的需求。并且：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>mcache 会持有 tiny 相关字段用于微对象内存分配。\u003C\u002Fli>\n\u003Cli>mcache 会持有 mspan 用于小对象内存分配。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>mcache 的数据结构如下：\u003C\u002Fp>\n\u003Cdiv class=\"ssr-code-block\" data-lang=\"text\">\u003Cdiv class=\"ssr-code-head\">\u003Cspan class=\"ssr-code-lang\">text\u003C\u002Fspan>\u003Cdiv class=\"ssr-code-actions\">\u003Cbutton class=\"ssr-code-fullscreen ssr-code-iconbtn\" type=\"button\" aria-label=\"全屏查看代码\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cbutton class=\"ssr-code-copy ssr-code-iconbtn\" type=\"button\" aria-label=\"复制代码\" title=\"复制\">\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--default\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--success\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--error\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"ssr-code-body\">\u003Cdiv class=\"ssr-code-pane\">\u003Cdiv class=\"ssr-code-gutter\" aria-hidden=\"true\">\u003Cspan class=\"ssr-code-num\">1\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">2\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">3\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">4\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">5\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">6\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">7\u003C\u002Fspan>\u003C\u002Fdiv>\u003Cpre class=\"ssr-code-pre\">\u003Ccode class=\"hljs language-text\">\u003Cspan class=\"ssr-code-line\">type mcache struct {\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">    tiny       uintptr \u002F\u002F 申请tiny对象的起始地址\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">    tinyoffset uintptr \u002F\u002F 从tiny地址开始的偏移量\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">    tinyAllocs uintptr \u002F\u002F tiny对象分配的数量\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">​\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">    alloc [numSpanClasses]*mspan \u002F\u002F 待分配的mspan列表,通过spanClass作为索引\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">}\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Cp>微分配器只会给非指针类型的对象分配为微内存。tiny，tinyoffset 和 tinyAllocs 是跟 tiny 微对象分配相关的参数；alloc 是待分配的 mspan 列表，不同规格的 mspan 通过 spanClass 值作为索引。\u003C\u002Fp>\n\u003Cp>如下是 runtime.mcache 的内存结构，主要包含两部分的内容，Tiny 对象和小对象的分配空间，小对象的内存分配空间是由 136（68 \u003Cspan class=\"katex\">\u003Cspan class=\"katex-html\" aria-hidden=\"true\">\u003Cspan class=\"base\">\u003Cspan class=\"strut\" style=\"height:0.6667em;vertical-align:-0.0833em;\">\u003C\u002Fspan>\u003Cspan class=\"mord\">×\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan> 2+1）个 spanClass 规格大小的 mspan 组成的列表。\u003C\u002Fp>\n\u003Cimg class=\"article-img article-img-zoomable\" src=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300825.png\" style=\"zoom:90%;\" \u002F loading=\"lazy\" decoding=\"async\" srcset=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300825.png?imageMogr2\u002Fthumbnail\u002F400x\u002Fformat\u002Fwebp\u002Fquality\u002F85 400w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300825.png?imageMogr2\u002Fthumbnail\u002F800x\u002Fformat\u002Fwebp\u002Fquality\u002F85 800w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300825.png?imageMogr2\u002Fthumbnail\u002F1200x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1200w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300825.png?imageMogr2\u002Fthumbnail\u002F1920x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1920w\" sizes=\"(max-width: 576px) 100vw, (max-width: 992px) 90vw, 720px\">\n\u003Cblockquote>\n\u003Cp>\u003Cstrong>关于 mcache 的总结\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Col>\n\u003Cli>一个 mcache 和一个 P（调度器）进行绑定，当这个 P 与当前 M 线程解绑，并和其它 M 线程进行绑定时，不需要进行 mcache 重新分配，节省了 goroutine 获取本地的 mcache 时的上下文切换所带来的性能开销。\u003C\u002Fli>\n\u003Cli>每一个 mcache 都包含 tiny 对象和小对象的内存空间。其中 tiny 对象除了要满足对象的大小要小于 16B 字节以外，还要求这个对象不包含指针。\u003C\u002Fli>\n\u003Cli>alloc 列表有 136 个索引，noscan 指针指向的 mspan 是用于分配没有内存引用的对象；scan 指针指向的 mspan 是用于分配有内存引用的对象。\u003C\u002Fli>\n\u003C\u002Fol>\n\u003C\u002Fblockquote>\n\u003Ch3 id=\"h3-8-mcentral\">中心缓存:mcentral\u003C\u002Fh3>\n\u003Cp>\u003Ccode>mcentral\u003C\u002Fcode> 是内存分配器的中心缓存，与线程缓存不同，访问中心缓存中的内存管理单元需要使用互斥锁。\u003C\u002Fp>\n\u003Cdiv class=\"ssr-code-block\" data-lang=\"text\">\u003Cdiv class=\"ssr-code-head\">\u003Cspan class=\"ssr-code-lang\">text\u003C\u002Fspan>\u003Cdiv class=\"ssr-code-actions\">\u003Cbutton class=\"ssr-code-fullscreen ssr-code-iconbtn\" type=\"button\" aria-label=\"全屏查看代码\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cbutton class=\"ssr-code-copy ssr-code-iconbtn\" type=\"button\" aria-label=\"复制代码\" title=\"复制\">\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--default\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--success\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--error\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"ssr-code-body\">\u003Cdiv class=\"ssr-code-pane\">\u003Cdiv class=\"ssr-code-gutter\" aria-hidden=\"true\">\u003Cspan class=\"ssr-code-num\">1\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">2\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">3\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">4\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">5\u003C\u002Fspan>\u003C\u002Fdiv>\u003Cpre class=\"ssr-code-pre\">\u003Ccode class=\"hljs language-text\">\u003Cspan class=\"ssr-code-line\">type mcentral struct {\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">    spanclass spanClass\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">    partial  [2]spanSet\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">    full     [2]spanSet\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">}\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\n\u003Cp>spanclass 表示这个 mcentral 的类型，不同跨度类的 mspan 对应有不同的 mcentral 管理。Size Class 总共有 0，8B，16B，24B，32B 到 32KB 共 68 种，因此 Go 内存分配器的中央缓存模型 MCentral 总共有 67 种 mcentral（会排除掉 0）。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>partial 和 full 分别维护空闲的 mspan 集合和已经被使用的 mspan 集合。mcache 向 mcentral 申请资源，当然是从 partial 集合获取。partial 和 full 都是一个[2]spanSet 类型，也就每个 partial 和 full 都各有两个 spanSet 集合，这是为了给 GC 垃圾回收来使用的，其中一个集合是已扫描的，另一个集合是未扫描的。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cimg class=\"article-img article-img-zoomable\" src=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300760.png\" alt=\"image-20240325122946018\" loading=\"lazy\" decoding=\"async\" style=\"width: 100%; height: auto; max-width: 100%; display: block;\" srcset=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300760.png?imageMogr2\u002Fthumbnail\u002F400x\u002Fformat\u002Fwebp\u002Fquality\u002F85 400w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300760.png?imageMogr2\u002Fthumbnail\u002F800x\u002Fformat\u002Fwebp\u002Fquality\u002F85 800w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300760.png?imageMogr2\u002Fthumbnail\u002F1200x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1200w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300760.png?imageMogr2\u002Fthumbnail\u002F1920x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1920w\" sizes=\"(max-width: 576px) 100vw, (max-width: 992px) 90vw, 720px\">\u003C\u002Fp>\n\u003Ch3 id=\"h3-9-mheap\">页堆:mheap\u003C\u002Fh3>\n\u003Cp>\u003Ccode>mheap\u003C\u002Fcode>是内存分配的核心结构体，Go 语言程序会将其作为全局变量存储，而堆上初始化的所有对象都由该结构体统一管理，该结构体中包含两组非常重要的字段，其中一个是全局的中心缓存列表 central，另一个是管理堆区内存区域的 arenas 以及相关字段。如下是页堆的内存示意图\u003C\u002Fp>\n\u003Cimg class=\"article-img article-img-zoomable\" src=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300703.png\" alt=\"image-20240325123506263\" style=\"zoom:80%;\" \u002F loading=\"lazy\" decoding=\"async\" srcset=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300703.png?imageMogr2\u002Fthumbnail\u002F400x\u002Fformat\u002Fwebp\u002Fquality\u002F85 400w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300703.png?imageMogr2\u002Fthumbnail\u002F800x\u002Fformat\u002Fwebp\u002Fquality\u002F85 800w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300703.png?imageMogr2\u002Fthumbnail\u002F1200x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1200w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251300703.png?imageMogr2\u002Fthumbnail\u002F1920x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1920w\" sizes=\"(max-width: 576px) 100vw, (max-width: 992px) 90vw, 720px\">\n\u003Ch2 id=\"h2-10-\">总结\u003C\u002Fh2>\n\u003Cp>Go 内存分配器中使用到的多级缓存机制，是程序开发中常用的设计理念，将对象根据大小分为不同规格，通过提高数据局部性和细粒度内存的复用率，能够有效提升不同大小对象的内存分配的整体效率。\u003C\u002Fp>\n\u003Ch2 id=\"h2-11-67\">附录（67种跨度类）\u003C\u002Fh2>\n\u003Cdiv class=\"ssr-table-wrap\">\u003Cbutton class=\"ssr-table-fs-btn\" type=\"button\" aria-label=\"全屏查看表格\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cdiv class=\"ssr-table-scroll\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth style=\"text-align:center\">class\u003C\u002Fth>\n\u003Cth style=\"text-align:center\">bytes\u002Fobj\u003C\u002Fth>\n\u003Cth style=\"text-align:center\">bytes\u002Fspan\u003C\u002Fth>\n\u003Cth style=\"text-align:center\">objects\u003C\u002Fth>\n\u003Cth style=\"text-align:center\">tail waste\u003C\u002Fth>\n\u003Cth style=\"text-align:center\">max waste\u003C\u002Fth>\n\u003Cth style=\"text-align:center\">min align\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">1\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">1024\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">0\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">87.50%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">2\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">16\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">512\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">0\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">43.75%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">16\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">3\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">24\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">341\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">29.24%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">4\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">32\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">256\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">0\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">21.88%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">32\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">5\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">48\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">170\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">32\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">31.52%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">16\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">6\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">64\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">0\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">23.44%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">64\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">7\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">80\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">102\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">32\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">19.07%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">16\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">8\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">96\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">85\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">32\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">15.95%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">32\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">9\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">112\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">73\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">16\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">13.56%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">16\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">10\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">64\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">0\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">11.72%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">11\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">144\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">56\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">11.82%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">16\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">12\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">160\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">51\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">32\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">9.73%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">32\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">13\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">176\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">46\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">96\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">9.59%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">16\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">14\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">42\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">9.25%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">64\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">15\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">208\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">39\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">80\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8.12%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">16\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">16\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">224\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">36\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8.15%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">32\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">17\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">240\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">34\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">32\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">6.62%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">16\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">18\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">256\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">32\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">0\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">5.86%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">256\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">19\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">288\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">28\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">12.16%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">32\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">20\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">320\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">25\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">11.80%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">64\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">21\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">352\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">23\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">96\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">9.88%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">32\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">22\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">384\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">21\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">9.51%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">23\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">416\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">19\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">288\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">10.71%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">32\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">24\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">448\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">18\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8.37%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">64\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">25\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">480\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">17\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">32\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">6.82%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">32\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">26\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">512\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">16\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">0\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">6.05%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">512\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">27\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">576\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">14\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">12.33%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">64\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">28\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">640\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">12\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">512\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">15.48%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">29\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">704\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">11\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">448\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">13.93%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">64\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">30\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">768\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">10\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">512\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">13.94%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">256\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">31\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">896\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">9\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">15.52%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">32\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">1024\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">0\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">12.40%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">1024\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">33\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">1152\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">7\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">12.41%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">34\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">1280\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">6\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">512\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">15.55%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">256\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">35\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">1408\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">16384\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">11\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">896\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">14.00%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">36\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">1536\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">5\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">512\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">14.00%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">512\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">37\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">1792\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">16384\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">9\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">256\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">15.57%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">256\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">38\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">2048\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">4\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">0\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">12.45%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">2048\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">39\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">2304\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">16384\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">7\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">256\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">12.46%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">256\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">40\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">2688\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">3\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">15.59%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">41\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">3072\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">24576\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">0\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">12.47%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">1024\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">42\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">3200\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">16384\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">5\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">384\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">6.22%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">43\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">3456\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">24576\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">7\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">384\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8.83%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">44\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">4096\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">2\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">0\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">15.60%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">4096\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">45\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">4864\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">24576\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">5\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">256\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">16.65%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">256\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">46\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">5376\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">16384\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">3\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">256\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">10.92%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">256\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">47\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">6144\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">24576\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">4\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">0\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">12.48%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">2048\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">48\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">6528\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">32768\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">5\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">6.23%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">49\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">6784\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">40960\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">6\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">256\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">4.36%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">50\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">6912\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">49152\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">7\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">768\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">3.37%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">256\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">51\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">1\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">0\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">15.61%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">52\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">9472\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">57344\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">6\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">512\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">14.28%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">256\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">53\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">9728\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">49152\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">5\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">512\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">3.64%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">512\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">54\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">10240\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">40960\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">4\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">0\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">4.99%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">2048\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">55\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">10880\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">32768\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">3\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">6.24%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">56\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">12288\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">24576\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">2\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">0\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">11.45%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">4096\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">57\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">13568\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">40960\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">3\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">256\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">9.99%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">256\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">58\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">14336\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">57344\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">4\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">0\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">5.35%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">2048\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">59\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">16384\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">16384\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">1\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">0\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">12.49%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">60\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">18432\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">73728\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">4\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">0\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">11.11%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">2048\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">61\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">19072\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">57344\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">3\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">3.57%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">62\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">20480\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">40960\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">2\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">0\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">6.87%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">4096\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">63\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">21760\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">65536\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">3\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">256\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">6.25%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">256\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">64\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">24576\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">24576\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">1\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">0\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">11.45%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">65\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">27264\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">81920\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">3\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">10.00%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">128\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">66\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">28672\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">57344\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">2\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">0\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">4.91%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">4096\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">67\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">32768\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">32768\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">1\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">0\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">12.50%\u003C\u002Ftd>\n\u003Ctd style=\"text-align:center\">8192\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\u003C\u002Fdiv>","内存分配思想 程序中的数据和变量都会被分配到程序所在的虚拟内存中，内存空间包含两个重要区域：栈区（Stack）和堆区（Heap）。 函数调用的参数、返回值以及局部变量基本上会被分配到栈上，这部分内存会由编译器进行管理； 对于堆区内存，不同编程语言使用不同的方法管理堆区的内存。C++ 等编程语言会由使用者主动申请和释放内","https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202403251301700.png"]