[后端与go内存管理|青训营笔记]

45 阅读2分钟

这是我参与[第五届青训营]笔记创作活动的第4天 本文主要想对课堂上一些知识点进行记录总结。今天所学的是go的内存管理。

一、本堂课重点内容:

  1. 自动内存管理
  2. go的内存管理及优化

二、详细知识点介绍:

自动内存管理

1.概念及背景

背景

自动内存管理是由程序语言的运行时系统管理动态内存,让程序员避免手动管理内存,专注于实现业务逻辑。同时保证内存使用的正确性和安全性(如 double-free problem 和 use-after-free problem )

自动内存管理:

  • 为新对象分配空间
  • 找到存活对象
  • 回收死亡对象的内存空间

概念

  • Mutator:业务线程
  • Collector:GC线程
  • Serial GC:只有一个collector,执行时暂停mutator
  • Parallel GC:可以有多个collectors同时进行回收,执行时暂停mutator
  • Concurrent GC:可以同时执行mutator和collector

评价GC算法的一些指标:

  • 安全性:GC不能回收存活对象
  • 吞吐率:1-GC时间/程序执行总时间
  • 暂停时间:业务暂停的时间
  • 内存开销:GC的内存开销

常见GC技术

追踪垃圾回收

在追踪垃圾回收中对象被回收的条件是指针指向不可达的对象。

追踪垃圾回收可分为三步:

  1. 标记根对象(静态变量、全局变量、常量、线程栈等)
  2. 找到所有可达对象(从根对象出发,根据指针指向方向去寻找)
  3. 清理所有不可达对象(Copying GC、Mark-sweep GC、Mark-compact GC)

可以使用分代GC以降低整体内存管理开销

引用计数

对象存活条件是当且仅当引用数大于0,其内存管理被平摊到程序的执行过程中去,且内存管理不需要了解runtime的实现细节

go的内存管理及优化