进程运行时,所占用的内存

一个进程运行时,所占用的内存,可以分为如下几个部分:

1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。

2、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS 回收。

3、全局变量、静态变量:初始化的全局变量和静态变量在一块区域,未初始化的全局变量

和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。

4、文字常量:常量字符串就是放在这里的,程序结束后由系统释放。

5、程序代码:存放函数体的二进制代码。

下面我们看一个例子程序:

//main.cpp

int a = 0; 全局初始化区

char *p1; 全局未初始化区

main()

{

int b; 栈

char s[] = "abc"; 栈

char *p2; 栈

char *p3 = "123456"; 123456\0 在常量区,p3 在栈上。

static int c =0;全局(静态)初始化区

p1 = (char *)malloc(10);

p2 = (char *)malloc(20);

分配得来得10 和20 字节的区域就在堆区。

strcpy(p1, "123456"); 123456\0 放在常量区,编译器可能会将它与p3 所指向的"123456"

优化成一个地方。

}

程序中的栈区对应于进程的栈段;

程序中的堆区对应于进程的堆段;

全局变量、静态变量因为其是可读写的,故存储在进程的数据段;

文字常量、程序代码因为其是只读的,故存储在进程的代码段。

时间: 2024-10-11 20:55:05

进程运行时,所占用的内存的相关文章

运行时Java对象在内存中的存储

建立对象是为了使用对象,Java程序需要通过栈上的reference数据来操作堆上的具体对象.对象的访问方式,取决于虚拟机的具体实现.目前主要有句柄和直接指针两种. 句柄访问: 在Java堆中划分一块内存作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息. 句柄访问的优势在于reference中存储的是稳定的句柄地址,对象被移动时只会改变句柄中的实例数据指针,而reference本身不需要修改. 直接指针访问: 直接指针访问方式的最大

UNITY2018.3 在editor下运行时new memoryprofiler显示 shader占用内存很大的问题在安卓上并没有看到

在安卓机上完全看不到shader占用的内存,但问题是,shader在安卓上真的几乎不占用内存了?(我们的游戏中只使用了mobile下的shader) 参考下面这个文章,说是真机上也有: Unity3D性能优化:ShaderLab内存占用 原文地址:https://www.cnblogs.com/timeObjserver/p/10561401.html

ART运行时Compacting GC为新创建对象分配内存的过程分析

在引进Compacting GC后,ART运行时优化了堆内存分配过程.最显著特点是为每个ART运行时线程增加局部分配缓冲区(Thead Local Allocation Buffer)和在OOM前进行一次同构空间压缩(Homogeneous Space Compact).前者可提高堆内存分配效率,后者可解决内存碎片问题.本文就对ART运行时引进Compacting GC后的堆内存分配过程进行分析. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 从接口层面

查看进程占用的内存情况

可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者按用户查看,如想查看java用户的进程内存使用情况的话可以使用如下的命令: (1)top top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器 可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者按用户查看,如想查看tomcat用户的进程内存使用情况的话可以使用如下的命令: $ top -u tomcat 内容解释: PID:进程的ID    US

Object-C 类,对象,运行时,isa 附带类本质的内存图

如果不是Apple,不是App Store,Object-C恐怕早就淡出人们的视线了.大部分编程语言都是基于C语法风格的,所以初次接触这个非C风格的语言,会看不懂它那怪异的语法.但如果掌握了它之后,也并不会觉得它又太多的不同.今天记录一下它的底层运作.       1: 类Class:       typedef struct objc_class * Class;     从Class的定义可以看出,它是一个 objc_class 结构类型的指针,objc_class又是什么呢? struct

mmdrv.exe进程占用大量内存及其他系统资源

收到阿里云的报警说是服务器进程数过多,然后登陆云监控一看,吓了一跳发现服务器的内存,cpu各种上升,登陆查看任务管理器进程出现好多mmdrv.exe进程,仔细寻觅一番才发现是测试工程师在使用Loadrunner做测试(尼玛也不说一声),原来虚惊一场,以下是自己了解的一些Loadrunner: Load Generator 对系统的要求 如果使用进程方式并发,并发10个虚拟用户,则会在任务管理器中出现10个mmdrv.exe进程: 如果使用线程方式并发,并发10个虚拟用户,只会在任务管理器中出现1

C++得到当前进程所占用的内存

原文地址:C++得到当前进程所占用的内存作者:雪碧狗 使用SDK的PSAPI (Process Status Helper)中的BOOL GetProcessMemoryInfo(  HANDLE Process,  PPROCESS_MEMORY_COUNTERS ppsmemCounters,  DWORD cb); typedef struct _PROCESS_MEMORY_COUNTERS {  DWORD cb;  DWORD PageFaultCount;  SIZE_T Peak

【翻译自mos文章】当并行事务恢复进程在运行时,禁用并行事务恢复的方法

当并行事务恢复进程在运行时,禁用并行事务恢复的方法 How to Disable Parallel Transaction Recovery When Parallel Txn Recovery is Active (Doc ID 238507.1) 适用于: Oracle Database - Enterprise Edition - Version 8.1.5.0 to 11.2.0.4 [Release 8.1.5 to 11.2] Oracle Database - Personal E

Linux查看进程内存占用及内存使用情况

LINUX进程内存占用查看方法(1)top可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者按用户查看,如想查看oracle用户的进程内存使用情况的话可以使用如下的命令:$ top -u oracle (2)pmap可以根据进程查看进程相关信息占用的内存情况,(进程号可以通过ps查看)如下所示:$ pmap -d 14596 (3)ps如下例所示:$ ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' 其中rsz是是实际内存