RSS和堆有什么区别?

时间:2013-06-29 14:57:45

标签: node.js memory language-agnostic heap

在Node.js的上下文中,我经常遇到RSS内存的提及。 Wikipedia article on RSS非常简洁,我仍然不确定它与堆内存的区别。它是堆+堆栈吗?有人可以解释一下,就像我5岁那样吗?

2 个答案:

答案 0 :(得分:7)

为进程提供内存以供操作系统运行。在现代32位和64位系统上,此存储空间看起来像是可以寻址的所有可能存储器地址的开放字段。实际上,操作系统对该过程“撒谎”,并且通常只能通过该过程可能解决的部分内存来支持该承诺。其余的是“虚拟的”。

由于CPU只能在RAM中执行数据和代码,因此操作系统与CPU协同工作以跟踪程序在RAM中使用的内存以及保存在磁盘上的特殊文件中的内容RAM(即页面文件/交换文件)。 RAM中的内容称为“常驻”或“工作”集。

作为开发人员,这一点非常重要,因为访问RAM中已经存在的内存所需的时间比操作系统必须首先将内存从磁盘加载到RAM要快许多个数量级。设计保持关键数据驻留的程序比不关心如何分配和访问内存的程序具有更高的性能特征。

堆是操作系统呈现给进程的大开内存的分区,组织为data structure bearing the same name。该进程使用此组织执行访问(并跟踪以后发布)一次只有小块。例如,如果进程想要存储一个整数数组,那么它需要一块具有尽可能多的字节的内存块,因为元素的数量乘以整数的大小。

此分区超出了操作系统的交换功能。我在运行时访问堆以存储我的对象和数据结构的内存字节分配,但是这个堆分配仍然存在于操作系统给我的内存中,它以4096字节“页面”的形式查看,可以移动来自磁盘的来回。

堆栈是操作系统提供进程的另一种特殊数据结构,但不同之处在于它一次获取所有堆栈,并且当一个进程按顺序将项目放入堆栈时,它会增加(或减少)一个特殊的数据结构指针(通常是一个特殊的CPU寄存器),用于跟踪它在此堆栈中的位置。在更高级别,每个线程跟踪堆栈以及指针在该堆栈中的位置。局部变量,函数参数和返回指针都存储在这里,当进程执行时,指针在这个内存中递增和递减,以跟踪这些事情。

答案 1 :(得分:3)

通常,程序员调用内存的应用程序级别实际上只是一个地址空间。所以堆,堆栈,甚至程序段都只是地址集。我们的程序,包括节点中的程序,使用这些地址读取和写入数据。我们称malloc为“内存管理器”,但它确实应该是“地址管理器”。单独的“虚拟内存”系统确定这些地址集是否映射到RAM,磁盘或根本没有。驻留集是由RAM支持的那些地址。常驻集合大小就是该集合的大小。