进程的内存空间划分(详解)

Posted 敲代码的Messi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程的内存空间划分(详解)相关的知识,希望对你有一定的参考价值。

从低地址 到 高地址:
一共 4G 运行内存。

  1. 在windows 中: 一般内核空间2G,用户空间(除了内核空间)2G。
  2. Linux中:一般内核空间 1G,用户空间3G。

代码区:

----------有时也叫文本段,通常指的是用来存放程序执行代码包含类成员函数和全局函数及其他函数代码),只需要有一份即可。再直白一点 就是 CPU执行的 机器指令。
-----------其中包括了 指令的操作码和操作对象(或对象地址引用)。如果是立即数(及具体的数值,如6),直接包含在 代码中。如果是栈中的数据,.bss区,.data区,则是 引用该数据的地址。
----------这部分区域的大小在程序运行前就已经确定,并且是共享的(其他执行程序可以调用它)。
----------代码区通常是只读的,原因是防止 意外的修改了其指令。因此 ,常量数据在编译时 在 代码区分配空间


全局变量区

全局变量区 又分为两块 :.bss 和 .data。其中存储的是由静态分配(静态持续性)的变量: 全局变量,静态变量。在 程序运行之初就申请了内存,生命周期为 整个程序运行过程,由系统自动释放。

.data(数据段)

----------已初始化的全局变量或者静态数据的一块内存区域。。

.bss(Block Started by Symbol)

----------通常指的是存放程序中未初始化或者初始化为0全局变量的和静态数据的区域。程序结束后静态资源变量由系统自动释放。
---------其中的数据在 程序开始执行之前被 内核初始为 0 或者空指针。


堆区

---------由用户动态分配, 由 用户自己释放,若不释放,会造成运行时的内存泄露。
--------- 不连续虚拟内存区域,系统用链表来管理堆区空间。
----------请求的 内存 是由 地址到高地址的。(向上申请内存)

栈区

----------存放程序临时创建的局部变量,不包括static声明的变量,static意味着在数据段中存放。
----------除此之外,当函数被调用时,其参数也会被压到栈中,并在调用结束后,函数的返回值也会被放到栈中。
---------连续的物理内存空间。在win中,每个线程的栈大小默认是 1M,Linux中,默认是8M。
----------请求的 内存 是由 高地址到低地址的。(向下申请内存)
----------register 关键字建议编译器用 CPU寄存器存储的变量(C++11之前)
注:当堆区 数据地址 和 栈区数据地址相同时(碰面了) 就代表,数据已用完。

以上是关于进程的内存空间划分(详解)的主要内容,如果未能解决你的问题,请参考以下文章

Android(IPC)进程间通讯1:详解Binder由来?

jvm原理(37)JVM内存空间划分与作用详解

jvm原理(37)JVM内存空间划分与作用详解

Linux进程地址空间与进程内存布局详解,内核空间与用户空间

Java—多线程创建详解

进程地址空间详解