知识卡片
GC降低心智负担
内容
垃圾回收把对象释放的责任从开发者手里转移给运行时,能避免手动管理常见的悬挂指针、多次释放等错误,也让模块之间不必为了释放内存而彼此感知实现细节。代价是需要保存内存状态信息、扫描内存,很多时候还要中断程序,因此不适合追求极致速度和极小内存的场景(如嵌入式);(书中 Go 1.14)Go 通过并发三色标记等机制持续压低这一代价,但暂停、吞吐、内存占用三者仍需运行时权衡。
参考来源
- 位置:《Go语言底层原理剖析》第19章《垃圾回收初探》19.1节《为什么需要垃圾回收》
- 结论依据:原文说明手动管理内存"不管是内存泄漏还是野指针都是让开发者非常头疼的问题",垃圾回收"提供了重要的保障,即不再被引用的对象最终将被收集……同样避免了悬空指针、多次释放等手动管理内存时会出现的问题",同时指出"垃圾回收并不是在任何场景下都适用的,因为垃圾回收带来了额外的成本……对于要求极致的速度时和内存要求极小的场景(例如嵌入式、系统级程序)并不适用",因此可以推出"垃圾回收降低心智负担但需要在暂停/吞吐/内存之间权衡"的结论。
- 原始内容:传统的没有垃圾回收功能的语言,例如C、C++,需要手动分配、释放内存。不管是内存泄漏还是野指针都是让开发者非常头疼的问题。虽然垃圾回收不保证完全不产生内存泄漏,但是其提供了重要的保障,即不再被引用的对象最终将被收集。这种设定同样避免了悬空指针、多次释放等手动管理内存时会出现的问题……垃圾回收并不是在任何场景下都适用的,因为垃圾回收带来了额外的成本,需要保存内存的状态信息……很多时候还需要中断整个程序来处理垃圾回收。因此,垃圾回收对于要求极致的速度时和内存要求极小的场景(例如嵌入式、系统级程序)并不适用。