通常而言,操作系统内存划分为以下几个区域:
- 寄存器(registers)
寄存器位于处理器内部,是CPU可以直接控制并进行存取的地方,但数量与容量都有限,所以一般用于高频数据的缓存。该区主要由操作系统直接管理,用户的语言代码没有直接控制权。
- 栈(stack)
栈区的存取效率仅次于寄存器,一般是连续的空间,常通过地址指针实时控制。该区的大小在程序运行前就会被设定好,但受限于操作系统及编译器的设置。在程序运行期间,编译器控制着栈区,实现资源的自动分配与释放,用于存储函数参数、局部变量、对象引用等。由于函数的调用及返回会涉及栈区内容的现场恢复等内部操作,所以大量的函数嵌套有可能会因为频繁的栈操作带来性能问题。
- 堆(Heap)
这是程序自己可以控制的区域,也叫内存池。该区不受编译器的控制,占用多大或占用多久可由开发者自行控制。不同的语言在堆的管理方式上会有不同。在C/C++这类语言中,对堆堆内存的分配与释放需要使用显式的方式,由开发者自行控制。如果不能在恰当时候释放内存,很容易导致内存泄漏;而且若释放不存在的内存区,也会引发致命的内存操作错误。不过在由垃圾回收机制的语言中,内存分配与释放是自动进行的,开发者几乎不用关注。但是,超出可用内存的数据占用也同样会出现溢出错误。
- 静态(Static)区
一般该区用于存储静态变量或者全局变量,即那些不需要改变位置的数据。在一些语言中,可以显示地告知编译器哪些变量是全局的,哪些变量是静态的。该区的控制权在编译器而不在开发者。
- 常量(Constant)区
程序中经常会有一些值是始终不变的。这些特殊值存放在一个专门的常量区,不但可以保证数据的安全性也能够提高运行效率。不过,常量区一般是运行期不可变的区域,由编译器直接控制。