golang-内存分配
1、概述
内存基本策略:
(1)每次从操作系统申请一大块内存,以减少系统调用。
(2)将申请的大块内存按照特定大小预先切分成小块、构成链表
(3)为对象分配内存时,只需从大小适合的链表提取一个小块即可
(4)回收对象内存时,将小块内存重新归还原链表,以便复用
(5)如果闲置内存过多,则尝试归还部分内存给操作系统,降低整体开销
内存块:
(1)Span:由多个地址连续的页组成的大块内存
(2)Object:将span按特定大小切分成多个小块,每个小块可储存一个对象。
span面向内部管理,object面向对象分配,分配器按页数来区分不同大小的span,在获取闲置span时,如果没有找到大小合适的,就返回页数更多的,此时会发生裁剪操作,多余部分将构成新的span放回管理数组,分配器还会将地址相邻的空闲span合并,减少碎片,提供更灵活的分配策略。