Oli*_*nde 6 language-agnostic memory heap node.js
在Node.js的上下文中,我经常遇到RSS内存的提及.关于RSS的维基百科文章非常简洁,我仍然不确定它与堆内存的区别.它是堆+堆栈吗?有人可以解释一下,就像我5岁那样吗?
一般来说,应用程序级程序员所说的内存实际上只是一个地址空间。所以堆、栈、甚至程序段都只是地址的集合。我们的程序(包括节点中的程序)使用这些地址读取和写入数据。我们将诸如 malloc 之类的东西称为“内存管理器”,但它实际上应该是“地址管理器”。一个单独的“虚拟内存”系统决定这些地址集是否映射到 RAM、磁盘或根本不映射。驻留集是那些由 RAM 支持的地址。常驻集大小就是该集有多大。
一个进程被给予内存以由操作系统运行.在现代32位和64位系统上,此存储空间看起来像是可以寻址的所有可能存储器地址的开放字段.实际上,操作系统对该过程"撒谎",并且通常只能通过该过程可能解决的部分内存来支持该承诺.其余的是"虚拟的".
由于CPU只能在RAM中执行数据和代码,因此操作系统与CPU协同工作以跟踪程序在RAM中使用的内存以及保存到虚拟RAM中磁盘上的特殊文件的内容(即pagefile/swapfile).RAM中的内容称为"常驻"或"工作"集.
这对于开发人员来说很重要,因为访问已经在RAM中的内存所需的时间比操作系统必须首先将内存从磁盘加载到RAM要快许多个数量级.设计保持关键数据驻留的程序比不关心如何分配和访问内存的程序具有更高的性能特征.
堆是将OS呈现给进程的大开存储器分区,组织成具有相同名称的数据结构.该进程使用此组织执行访问(并跟踪以后发布)一次只有小块.例如,如果进程想要存储一个整数数组,那么它需要一块具有尽可能多的字节的内存块,因为元素的数量乘以整数的大小.
这种分区超出了操作系统的交换功能.我在运行时访问堆以存储我的对象和数据结构的内存字节分配,但是这个堆分配仍然存在于操作系统给我的内存中,它以4096字节"页面"的形式查看,可以移动来自磁盘的来回.
堆栈是操作系统提供进程的另一种特殊数据结构,但不同之处在于它一次获取所有堆栈,并且当一个进程按顺序将项目放入堆栈时,它会递增(或递减)一个特殊指针(通常一个特殊的CPU寄存器)来跟踪它在这个堆栈中的位置.在更高级别,每个线程跟踪堆栈以及指针在该堆栈中的位置.局部变量,函数参数和返回指针存储在此处,并且当进程执行以跟踪这些事物时,指针在该存储器上递增和递减.