自动内存管理 | 青训营笔记

74 阅读2分钟

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

1. 今日学习内容

今天主要学习了性能优化相关的概念,以及自动内存管理方面的概念和算法、Golang的内存管理和编译器相关的优化等。本篇笔记主要记录和自动内存优化相关的内容。

2. 自动内存管理

2.1 基本概念

  • 动态内存
    • 程序在运行时根据需求动态分配的内存
  • 自动内存管理(垃圾回收)
    • 由程序语言运行时系统管理动态内存
    • 避免手动管理内存,专注于实现业务逻辑
    • 保证内存使用的正确性和安全性
  • 相关名词
    • Mutator:业务线程,分配新对象,修改对象指向内容
    • Collector:GC线程,找到存活对象,回收死亡对象的内存空间
    • Serial GC:只有一个collector
    • Parallel GC:支持多个collectors同时回收
    • Concurrent GC:mutatior和collector可以同时执行

2.2 评价指标

  • 安全性:不能回收存活对象的基本要求
  • 吞吐率:花在GC上的时间
  • 暂停时间:业务是否感知
  • 内存开销:GC元数据开销

2.3 追踪垃圾回收

  • 对象被回收条件:指针不可达的对象
  • 工作:
    • 标记根对象
      • 静态变量、全局变量、常量、线程栈等
    • 标记:找到可达对象
      • 求指针指向关系闭包,从根对象出发,找到所有可达对象
    • 清理:清理所有不可达对象
      • Copying GC:将存活对象复制到另外的内存空间
      • Mark-sweep GC:将死亡对象的内存标记为可分配
      • Mark-compact GC:移动并整理存活对象

2.4 分代 GC

  • 分代假说很多对象在
    • 分配出来后很快就不再使用了
    • 每个对象都有年龄:经历过GC的次数
    • 目的:针对年轻和老年对象,制定不同GC策略
    • 不同年龄的对象处于heap的不同区域

2.5 引用计数

  • 每个对象都有一个阈值关联的引用计数
  • 对象存活条件:当且仅当引用数大于0
  • 优点:
    • 内存管理的操作被平摊到程序执行过程中
    • 内存管理不需要了解runtime的实现细节(如C++智能指针)
  • 缺点:
    • 维护引用计数开销大
    • 无法回收环形数据结构
    • 回收内存时依然可能引发暂停