初识内存管理 | 青训营笔记

79 阅读2分钟

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

自动内存管理是什么?

程序在运行时会动态的根据需求来分配内存,如C语言中的malloc(),针对这块动态内存进行管理的系统,就叫自动内存管理,或者垃圾回收系统(Garbage Collection/GC)。

自动内存管理有哪些任务

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

自动内存管理的基本运行逻辑

假定一个程序有两种线程,一种是业务线程(mutator),一种是GC线程。在业务线程的间隙,就会插入GC线程,来进行GC,然后再继续业务线程,GC线程时间一般非常短,让我们感知不到它的存在。

几种gc线程的执行方式

gc1.png 每次mutator暂停都由一条gc线程来进行垃圾回收处理 gc2.png 每次mutator都由多条gc线程处理,还是需要暂停mutaor线程

gc3.png 无需暂停mutator线程,可以在某段时间内同时处理两种线程的工作。

哪种执行方式会是比较好的呢?又或者我们怎样去综合使用。

要做出评价,就需要有一个评价的衡量标准。gc算法会从下面几种指标来衡量

  • 安全性:不会把存活的对象也回收

  • 吞吐率:花在gc上的时间要尽量少

  • 暂停时间:暂停的时候业务是否感知

  • 内存开销:GC元数据开销 简述垃圾回收算法

  • 追踪垃圾回收

  • 引用计数

追踪垃圾回收

  1. 在内存的几个区域(栈,堆,全局),标记根对象
  2. 根据根对象指针,找到所有可达对象
  3. 清理:所有不可达对象都应该被清理掉。

标记根,根据跟指针来寻找可达对象,可以想象成从树根开始搜索树的过程。

清理的几种方式方法

  • -copy GC
  • -Mark-sweep GC
  • -Mark—compact GC copy GC和Mark-compact GC类似,前者是复制到另外的内存空间,后者是复制到现有的内存空间起点,进行整合,避免碎片内存。而Mark-sweep GC则是用链表维护好零碎清理掉的空间,进行再分配。

不同的对象应该使用不同的清理方式策略。分代GC就是很好的例子。

引用计数

  • 前提:每个对象都会有一个关联的引用数目

  • 清理条件:对象引用数为0

  • 优点:

    程序会在运行的执行中同时对对象进行清理,且不需要知道runtime的实现细节

  • 缺点:

    • 内存开销,每个对象需要额外空间存储数目
    • 维护计数开销较大:需要原子操作
    • 无法回收环形结构等..