卡码笔记-最强八股文
首页
计算机基础
C++
Java
Go
🔥大模型🔥
  • 大模型面经
  • Java面经
  • C++面经
简历专栏
代码随想录 (opens new window)
首页
计算机基础
C++
Java
Go
🔥大模型🔥
  • 大模型面经
  • Java面经
  • C++面经
简历专栏
代码随想录 (opens new window)
  • 本栏必读

    • Go语言面试题专栏介绍
  • 语言基础

  • 内存管理

    • Go的内存管理机制
      • 简要回答
      • 详细回答
      • 知识图解
      • 知识扩展
    • 对象分配在栈上还是堆上
    • 内存分配优化
    • 什么情况会导致内存泄漏
  • 并发编程

  • 底层原理

# Go语言的内存管理机制是怎样的?

以下为知识星球 (opens new window)录友分享的字节后端一面问题:“Go语言的内存管理机制是怎样的?”(下文知识图解部分提供了底层原理图示)

# 简要回答

Go 的内存管理机制包括内存分配和垃圾回收两部分。

内存分配采用基于 TCMalloc 的分级缓存策略,将内存分为微小对象、小对象和大对象,不同大小的对象采用不同的分配策略。

垃圾回收采用并发标记清除算法,通过混合写屏障技术实现并发标记,大大减少了 GC 停顿时间。Go 1.12 引入了并发清理,进一步优化了 GC 性能。

# 详细回答

Go 语言的内存管理机制包括内存分配和垃圾回收两个核心部分。

内存分配采用分级缓存策略,将内存分为微小对象、小对象和大对象,不同大小的对象采用不同的分配策略。

  • 微小对象(<16字节)通过线程本地缓存(mcache)中的 Tiny 分配器分配,多个对象共享一个插槽,避免了锁竞争;

  • 小对象(16字节~32KB)优先通过 P(处理器)私有的线程本地缓存(mcache)分配,不足时向中心缓存(mcentral)申请;

  • 大对象(>32KB)直接从堆(mheap)分配。

垃圾回收采用并发标记清除算法,通过三色标记法实现。

标记阶段分为标记准备、并发标记和标记终止三个步骤,其中标记准备和标记终止需要 STW,但由于混合写屏障的引入,停顿时间非常短。

清理阶段在 Go 1.12 之后也实现了并发清理,进一步减少了 GC 停顿时间。

Go 还通过逃逸分析优化内存分配,将部分对象分配在栈上而非堆上,减少 GC 压力。

# 知识图解

内存分配机制:

image

# 知识扩展

Go 语言的内存管理机制中,逃逸分析是一个重要的优化手段。

逃逸分析通过静态分析确定变量的作用域,判断变量是否会逃逸到堆上。

如果变量不会逃逸到堆上,就可以分配在栈上,这样可以避免 GC 的开销。

# 面试官可能会追问:

Q1:Go 语言的垃圾回收有哪些阶段?

A1:Go 语言的垃圾回收主要分为四个阶段:清理终止、标记、标记终止和清理。

  • 清理终止阶段需要 STW,主要是开启写屏障并为标记做准备;

  • 标记阶段是并发执行的,通过三色标记和混合写屏障技术跟踪对象的引用关系;

  • 标记终止阶段需要 STW,主要是关闭写屏障、清扫统计等;

  • 清理阶段是并发执行的,主要是回收不再使用的内存。

Q2:Go 语言的内存分配器是如何工作的?

A2:Go 语言的内存分配器主要由 mcache、mcentral 和 mheap 三级结构组成。

  • mcache 是绑定在 P(处理器)上的本地缓存,包含不同规格的 span,用于快速分配微小和小对象;

  • mcentral 是全局的缓存,按规格管理 span;

  • mheap 是整个堆的管理结构,用于分配大对象。

当 mcache 中的内存用完时,会从 mcentral 中获取;当 mcentral 也不足时,会从 mheap 分配。

这种分级策略极大地减少了多线程下的锁竞争。

Q3:Go 语言的逃逸分析是如何工作的?

A3:Go 语言的逃逸分析通过静态分析确定变量的作用域,判断变量是否会逃逸到堆上。

如果变量不会逃逸到堆上,就可以分配在栈上,这样可以避免 GC 的开销。

逃逸分析的实现主要基于数据流分析,通过分析变量的使用情况来判断是否会逃逸。

例如,如果变量被返回给调用者,或者被存储到全局变量/堆对象中,就会逃逸到堆上。

Last Updated: 4/29/2026, 3:26:47 PM

← panic和recover的作用及使用场景 对象分配在栈上还是堆上 →

评论

验证登录状态...

侧边栏
夜间
卡码简历
代码随想录
卡码投递表🔥
2026群
添加客服微信 PS:通过微信后,请发送姓名-学校-年级-2026实习/校招
支持卡码笔记
鼓励/支持/赞赏Carl
1. 如果感觉本站对你很有帮助,也可以请Carl喝杯奶茶,金额大小不重要,心意已经收下
2. 希望大家都能梦想成真,有好的前程,加油💪