这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记
自动内存管理,即垃圾回收,就是由程序语言的运行时系统管理动态内存。使用自动内存管理,将程序员从手动内存管理及其带来的内存泄露、多次释放内存、释放后使用内存等诸多问题中解放出来,从而可以专注于实现业务逻辑。
垃圾回收线程和业务线程的执行关系可以分为三种模式:Serial GC Parallel GC 和Concurrent GC。其中Serial GC 和 Parallel GC 会打断业务线程的运行,而Concurrent GC 做到和业务线程并发执行;Serial GC 是单个GC线程,Parallel GC 是多个GC线程。
垃圾回收算法有追踪垃圾回收和引用计数等,回收对象又有将对象复制到额外的内存空间的Copying GC、使用Free List的Mark-Sweep GC 和原地整理对象Compact GC三种方式。
在追踪垃圾回收算法中,一旦对象不是任何其他对象指针指向的对象,即关系不可达,就会被回收。这种算法通过“标记根对象 -> 找到可达对象 -> 清理所有不可达对象”的流程进行垃圾回收。同时,可以根据对象的生命周期使用不同的标记和清理策略以进一步优化垃圾回收效果。分代垃圾回收就是根据对象的“年龄”制定不同的垃圾回收策略,以降低整体内存管理的开销。对象的“年龄”可以采用 对象经历过GC的次数 来衡量。年轻的对象存活数量较少,可以采用Copying GC的方式回收;老年的对象存活时间较长,反复复制开销较大,可以采用Mark-Sweep GC的方式回收。
在引用计数算法中,GC为每一个对象维护一个引用计数,当对象引用计数归零时即被回收,从而将GC操作平摊到程序的执行过程中,且将内存管理与运行时的实现细节解耦。典型的实现比如boost的智能指针库。同时,引用计数算法也有明显的缺点,比如:引用计数带来的额外内存开销;回收一个对象可能带来的连锁反应导致程序停顿;无法回收环形数据结构(可以借助使用弱引用绕过)等。