Go语言学习7 | 青训营笔记

61 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第七天。

一、课程主要内容

  • 自动内存管理

二、课程具体内容

1.动态内存的概念

1.1动态内存

程序在运行时根据需求动态分配的内存:galloc()—— 需要时分配,不需要时回收。

1.2自动内存管理

由程序语言的运行时系统管理动态内存的回收,这样做可以避免手动管理内存,专注于业务逻辑地实现,同时保证内存的使用具有正确性与安全性。

1.3内存管理的三个任务

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

相关概念

  • Mutator:业务线程,分配新对象,修改对象的指定关系。
  • Collector:GC线程,找到存活对象,回收死亡对象的内存空间
  • Serial GC:只有一个collector
  • Parallel GC:支持多个collector GC同时回收的GC算法
  • Concurrent GC:Mutators和Collector可以同时运行的GC算法。

图片.png

评价GC算法的几个标准:

  • 安全性:指垃圾回收器不应该回收存活的对象
  • 吞吐率:1-垃圾回收器花在GC上时间的总比率
  • 暂停时间:指垃圾回收导致业务线程挂起的时间
  • 内存开销:指垃圾回收器元数据占用的内存开销

分代GC

  • 对象的年龄:该对象经历GC的次数
  • 目的:对于不同年龄的对象,制定不同的GC策略,降低内存管理的整体开销

追踪垃圾回收

对象被回收的条件:指针指向关系不可达的对象

  1. 标记根对象:静态变量、常量、全局变量、线程栈等
  2. 从根对象,标记所有可达对象
  3. 清理所有不可达对象: 1.将存活对象复制到另外的内存空间 2.将死亡对象的内存标记为可分配 3.移动并整理存活对象