首先简单理解一下计算机的体系结构:
-
这里计算机硬件中CPU有个寄存器,寄存器也是存储器的一种 ,寄存器主要用来暂存指令,位址,和数据,是一种有限的高速存储部件;我们通常说的内存我理解为包含RAM(随机存储器,数据不能做到持久化,但是高效,空间资源有限)和ROM(数据可以做到持久化,但是效率不高,空间资源大);但是在其他有些资料上将Cache(高速缓冲存储器)也划进来了,因为Cache本质就是用RAM实现的,所以我认为没必要品将他划到内存中。
-
说完了寄存器和内存,接下来就该进入正题说一说他们在代码中的关系了,首先得明确:程序是运行在内存中的 ,当程序没有启动时,是安装在ROM中的,当你运行时系统会将程序拷贝到RAM,在RAM中去执行代码,所以执行代码关键在RAM中。
代码运行在RAM中分为5个区块:
-
堆区(heap)
堆区存放的主要是程序员自己new出来的对象,手动开辟的空间都放在堆区,需要手动释放空间,地址分配由低到高
-
栈区
栈区是编译器自主分配的一块变量存储区域,需要时就创建,不需要时就销毁,全程由编译器自主控制,栈的特点是先进后出且是一块连续的存储地址空间,所以它的地址分配是由高到低。栈区主要存储的是局部变量或者方法中的参数,或者理解为栈中存放的是一个一个的方法,方法结束就将其弹出并释放内存。
-
静态/全局区
此区分为两大块:数据段和bss段
数据段:数据段存放初始化过的静态变量或者全局变量
bss段:bss段存放未初始化的静态变量或者全局变量,也就是说bss是不分配内存地址的,它的作用是记住变量需要多少空间大小
-
常量字符串区
该区域存放的常量字符串,const,final等
-
代码区
存放的是程序代码,有些架构可以进行代码的更改
-
-
了解代码在内存的结构后需要知道是如何同cpu工作的
-
cpu从RAM中读取或者向RAM中写入都需要借助操作系统完成
-
CPU寄存器执行命令是一些变量基本都会存放在Cache中,需要的时候都会先从Cache中去取,如果没有才会从内存(RAM或者ROM中去寻找)
-