内存分配是为对象在heap上分配内存。要进行这个操作,要调用系统调用mmap()向OS申请一大块内存,内存大小包括8B,16B和24B。之后,便要将这一大块内存进行划分,这部成为mspan。mspan又由包不包含指针对象和需不需要被GC扫描分为noscan mspan(否)和scan mspan(是)。 由于对象分配频率较高,且小对象占比较高,所以内存管理优化显得尤为重要。 在优化上,字节跳动制定了一个方案,简称为GAB,即每个g都绑定一大块内存,用于<128B对象的分配,同时使用base,end,top三个指针作为维护。GBA相对于GO内存管理是一个大对象,其本质是将多个小对象分配合成一次大对象分配。但它也有其缺点,即对象分配方式会导致内存会延迟释放。但这个问题可以通过copying G的算法解决。 介绍完GO内存管理分块和缓存两种思想后,便要把视线转到GO对象分配的性能问题上去了。当然,其中也涉及到Balanced GC,这两步都与编译器和静态分析有着密切关系。 静态分析又分为控制流分析和数据流分析。一个着眼于对程序执行,另一个则着眼于数据在控制流上的传递。除了这两种分析,还有过程内分析和和过程间的分析。