编译器生成的目标代码需要运行在“运行时环境”中。
其中程序的逻辑地址是由编译器、操作系统与目标机(物理机)共同完成的。操作系统负责将逻辑地址映射为物理地址,而物理地址对整个内存空间编址。
一个目标程序的逻辑地址空间的运行适合映像包含 代码区 和 数据区。比如:
(运行时刻内存被划分成代码区和数据区的典型方式,代码区和静态区位于低端。而栈区位与高端,堆和栈可动态调节。)
分析一下各个区域的作用:
生成的目标代码大小在编译时刻已经固定下来了,因此可以放在一个静态确定的区域(代码区)。这个区通常位于存储的低端。
类似的,程序的某些数据对象(包括全局常量和用于支持垃圾回收的信息)可以在编译时刻知道,他们被放置在另一个称为静态区的区域中。
为了将剩余空间最大化,堆和栈被放在剩余空间的相对两端,并可动态调节(随程序运行而改变)。两个区域根据需要向对方增长。其中栈用来存放活动记录的数据结构,这些记录在函数调用中生成。
而堆内存,主要是因为某些数据的生命周期要比创造它的某次过程调用更长,故将此类数据放置在一个可复用的堆中。堆是虚拟内存的一个区域,它允许对象或其他数据元素在被创建时获得存储空间,并在数据变得无效时释放该存储空间。