当前位置:嗨网首页>书籍在线阅读

04-内存管理及其分类

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

5.3 内存管理及其分类

计算机中的RAM是有限资源,并且由所有正在运行的程序共享。当进程完成其指令后,它必须释放所有使用的内存,以便操作系统可以回收内存,并将内存交给其他进程使用。当讨论内存管理时,我们关注的一个重点是已使用内存的回收及其工作原理。取消分配已使用内存所需的管理级别在不同语言中是不同的。直到20世纪90年代中期,大多数编程语言都依赖于手动内存管理,这需要程序员分别调用内存分配器API(例如malloc和free)代码来分配和释放内存。大约在1959年,Lisp的创建者John McCarthy发明了GC,这是一种自动内存管理机制,Lisp是第一种采用它的语言。作为运行程序的一部分,GC以守护线程的形式出现,并分析程序中不再引用内存的任何变量,然后在某个时间点在运行程序的同时自动释放它们。

但是,低级语言不附带GC,因为这会引入不确定性和运行时开销,GC线程在后台运行,在某些情况下会暂停程序的运行。

这种暂停有时会出现几毫秒的延迟。这可能违反了系统软件在时间和空间上的硬性约束。低级语言要求程序员可以手动控制内存管理。但是,像C++和Rust这样的语言通过类型系统抽象(如智能指针)使程序员能够减轻一些负担,与之有关的详情将会在本章后续内容中介绍。

基于语言之间的差异,我们可以将它们采用的内存管理策略大致分为3类。

  • 手动型 :C语言采用了这种内存管理机制,且完全由程序员负责,在程序代码使用完内存之后调用free函数来释放内存。C++在某种程度上使用智能指针自动执行此操作,其中free函数调用放在类的析构函数定义中。Rust也有智能指针,我们将在本章后续内容中进行介绍。
  • 自动型 :采用这种内存管理形式的语言包括一个额外的运行时线程,即GC,它作为守护线程与程序一起运行。诸如Python、Java、C#及Ruby等大部分基于虚拟机的动态语言都依赖自动化内存管理。自动化内存管理是使用这些语言编写代码很容易的原因之一。
  • 半自动型 :Swift等语言属于这一类别。它们没有作为运行时的一部分的内置专用GC,但提供了引用计数类型,这可以细粒度地实现自动化内存管理。Rust也提供了引用计数类型Rc和Arc。当我们在本章介绍智能指针时会提及它们。