自动内存管理机制总结 | 青训营笔记

209 阅读3分钟

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

当下,不少编程语言,例如Java、Go、Swift等等语言都包含自动内存管理机制,系统会自动进行内存垃圾回收和内存分配,而不需要像C、C++等语言一样由开发者自行进行内存管理。本文介绍了自动内存管理机制的基本概念、总结了一些常见的内存垃圾回收机制。

基本概念

自动内存管理是指由程序语言的运行时系统动态管理内存,而不是由开发者手动管理内存。使用自动内存管理机制避免了手动内存管理,从而使开发者能够专注于业务逻辑实现,不用过多考虑内存管理问题。此外,自动内存管理也避免了手动管理内存可能导致的内存使用不当,减少了因为内存管理产生的bug(例如未释放不被使用的内存造成内存泄露)。

自动内存管理机制需要保证内存使用的正确性和安全性,解决double-free problem(即试图释放已经被释放的内存空间)、use-after-free problem(即在未来还会用到该处内存的情况下释放了此处内存)等问题。

自动内存管理主要有三个任务:

  • 为新对象分配内存空间
  • 找到存活对象
  • 回收死亡对象的内存空间(即垃圾回收 Garbage Collection)

在自动内存管理中,主要有两个概念:

  • Mutator:负责分配新对象、修改对象指向关系
  • Collector:负责垃圾回收,即找到死亡对象、回收死亡对象的内存空间

垃圾回收(GC)按照Collector的运行状况来分类,可以分成下面几种:

  • Serial GC: 只有一个Collector
  • Parallel GC: 并行GC,支持多个Collectors同时回收
  • Concurrent GC: 并发GC,支持Mutator(s)和Collector(s)同时执行

常见垃圾回收机制

下文将介绍一些常见的垃圾回收机制。

追踪垃圾回收 Tracing Garbage Collection

顾名思义,追踪垃圾回收是通过在内存中追踪对象实现的垃圾回收。垃圾回收系统将会从某些根节点(称之为GC ROOT)出发遍历所有对象,并在遍历过程中标记每个对象,最后没有标记的对象就是不可达对象。垃圾回收系统将会回收所有的不可达对象的内存空间。

引用计数垃圾回收 Reference Counting Garbage Collection

引用计数垃圾回收则是给每个对象分配一个引用数,每次对象被使用时为引用数加一,而在对象的生命周期结束时将引用数减一。每次垃圾回收时回收所有引用计数小于等于零的对象的内存空间。