如何选择编程语言(2)内存管理

如何选择编程语言(2)内存管理
0

本系列的其他文章:
如何选择编程语言(1)执行方式
如何选择编程语言(3)强类型 VS 弱类型
如何选择编程语言(4)并行/并发模型
如何选择编程语言(5)面向对象
如何选择编程语言(6)函数式编程
如何选择编程语言(7)对 null 的处理
如何选择编程语言(8)官方 API
如何选择编程语言(9)第三方库生态

2.1. 手动管理内存

汇编语言以及 C / C++、Fortran、Pascal 等许多编译执行型语言都需要手动管理内存,由程序员手动回收无用的数据占用的内存。

2.2. 自动管理内存

编译执行型语言中的 Go,Java、C#、VB.net 等绝大多数编译、解释执行型语言,还有 JavaScript、Python、PHP 等绝大多数脚本语言都是由运行环境自动管理内存(增加作为对象池的堆的内存、无用对象的垃圾回收等)。

其中 Go 主要采用标记清除算法做垃圾回收(英文 Garbage Collection,缩写 GC)。而 Java 可以指定标记清除、标记整理、标记复制与标记清除结合的分代 GC 算法等等算法中的一种做垃圾回收。对于其他语言的 GC 算法,我没了解过,读者有兴趣可以自己查阅资料。

2.3. 半自动管理内存

Rust 语言中多数情况下,通过对象的所有权机制可以使得对象的内存申请和释放在编译期就可以确定,这些对象的内存管理可以看成是由编译器自动处理的。对于少数不受所有权机制限制的不安全对象,仍需要手动管理内存。

2.4. 自动管理内存的优劣

2.4.1. 优点

把程序员从释放无用内存或者管理内存池等逻辑中解放出来,降低内存泄漏的可能性。

2.4.2. 缺点

程序员通常无法控制垃圾回收的时机,而垃圾回收通常需要暂停程序的运行,这会导致无法预料的程序卡顿。

1赞