内存管理与垃圾回收机制
前置知识
字和字节
位(bit): 一个二进制数码0或1, 是计算机存储处理信息最基本和最小的数据单位. 字节(byte): 一个字节由8个位组成, 是计算机存储信息的基本单位, 也是计算机存储空间大小的最基本单位. 1TB = 2^10GB = 2^20MB = 2^30KB = 2^40B = 2^50b 字(word): 若干个字节组成字, 16个位为一个字, 32位为一个双字, 64位是两个双字, 它代表计算机处理指令或数据的二进制数位数, 是计算机进行数据存储和数据处理的运算单位. 字长: CPU内每个字可以包含的二进制的长度称为字长(word size), 如32位(四个字节)表示CPU一次能处理四个字节.
内存
内存是一种用半导体技术做成的电子设备, 用于存储数据, 电子电路的数据是以二进制的方式存储, 存储器的每一个存储单元称为记忆元. 内存分为易失性的和非易失性的存储器, 但是一般我们说的内存指的是易失 性的, 而非易失性的存储器我们称为磁盘. 内存主要是进程,文件加载,系统运行等高速缓存的临时运行存储空间. 内存速度快, 但是存储空间小, 而其中的缓存部分速度更加快. 每个进程在运行的时候都需要被分配内存.
内存的分配主要有静态分配和动态分配两种. 静态分配需要在编译阶段知道内存可用空间的大小, 是在编译时分配, 从栈空间中分配, 以后进先出的顺序移除这些调用. 动态分配不用知道内存可用空间的大小, 在运行时动态分配,从堆空间中分配, 没有特定的执行顺序.
JavaScript如何工作:内存管理+如何处理4个常见的内存泄漏
概述
像 C 这样的编程语言,具有低级内存管理原语,如malloc()和free()。开发人员使用这些原语显式地对操作系统的内存进行分配和释放。
而JavaScript在创建对象(对象、字符串等)时会为它们分配内存,不再使用对时会“自动”释放内存,这个过程称为垃圾收集。这种看“自动”似释放资源的的特性是造成混乱的根源,因为这给JavaScript(和其他高级语言)开发人员带来一种错觉,以为他们可以不关心内存管理的错误印象,这是想法一个大错误。
即使在使用高级语言时,开发人员也应该了解内存管理(或者至少懂得一些基础知识)。有时候,自动内存管理存在一些问题(例如垃圾收集器中的bug或实现限制等),开发人员必须理解这些问题,以便可以正确地处理它们(或者找到一个适当的解决方案,以最小代价来维护代码)。