博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内存的那些事
阅读量:6290 次
发布时间:2019-06-22

本文共 995 字,大约阅读时间需要 3 分钟。

先说内存存储区域分类:

代码区(text segment):主要包含操作代码和操作对象的地址,地址指向对象存放的区域(堆,栈,静态存储区等),具体的数值也包含在代码中。代码区的代码按照程序规则顺序执行,反复,则需要使用跳转指令,递归,需要借助栈来实现。

静态存储区(data segment):主要存储全局变量(extern),静态变量(static),主要特点是指初始化一次

未初始化数据区(bss):主要存储全局未初始化的变量,例如未在任何方法中声明的一些变量:NSString *age;

栈(stack):由编译器自动分配和释放,栈的栈顶地址和容量大小时系统预先规定好的,所以是一块连续的内存区域。存储非静态的局部变量,函数方法参数和返回值的指针等,栈的大小一般只有几兆,当系统内存不够分配时,系统会提示栈内存溢出。递归,每次地柜调用方法时,都会生成一个新的栈列,这样多个调用方法之间的变量不会混淆。

 

堆区(heap): 位于bss和栈之间,由程序员动态分配,需要手动释放,或者程序结束时,os自动释放

 

内存的分配方式:

静态分配:编译器在处理程序源代码时分配,在程序执行之前进行,效率比较高,静态对象是有名字的变量,可以直接对其进行操作,自动分配,自动释放

动态分配:程序在执行时,调用malloc库函数申请内存,动态对象时没有名字的变量,通过指针进行间接操作,手动释放

 

堆和栈的区别:

1.储存对象不同

2.管理方式不同:栈自动分配释放,堆手动分配释放

3.空间大小不同:栈大小一般只有1到2m,且是一段连续的区域,栈中的元素都是有序的,先进后出的原则,不会出现从中间弹出的情况。堆是从高地址扩展的数据结构,不连续,系统用链表来存储地址,堆的空间比较大,手动分配和释放,比较灵活

4.是否出现泄漏:栈自动分配和释放,不会出现泄漏。堆上手动分配空间,且分配的空间的不连续,会出现大量的碎片,使用效率并不高,需要手动释放,防止出现泄漏

5.增长方向不同:堆的内存地址增长从低到高,栈相反

6.分配方式不同:栈自动分配释放,堆手动分配释放

7.分配效率不同:栈由系统分配,入栈出栈都有专门的指令,效率较高。堆需要计算内存空间大小,不够分配的,需要重新整理内存空间,所以效率较低

转载于:https://www.cnblogs.com/xiaomaisgs/p/7510864.html

你可能感兴趣的文章
高德开放平台开放源代码 鼓励开发者创新
查看>>
《高并发Oracle数据库系统的架构与设计》一2.5 索引维护
查看>>
Firefox 是 Pwn2own 2014 上攻陷次数最多的浏览器
查看>>
阿里感悟(十八)- 应届生Review
查看>>
话说模式匹配(5) for表达式中的模式匹配
查看>>
《锋利的SQL(第2版)》——1.7 常用函数
查看>>
jquery中hover()的用法。简单粗暴
查看>>
线程管理(六)等待线程的终结
查看>>
spring boot集成mongodb最简单版
查看>>
DELL EqualLogic PS存储数据恢复全过程整理
查看>>
《Node.js入门经典》一2.3 安装模块
查看>>
《Java 开发从入门到精通》—— 2.5 技术解惑
查看>>
Linux 性能诊断 perf使用指南
查看>>
实操分享:看看小白我如何第一次搭建阿里云windows服务器(Tomcat+Mysql)
查看>>
Sphinx 配置文件说明
查看>>
数据结构实践——顺序表应用
查看>>
python2.7 之centos7 安装 pip, Scrapy
查看>>
机智云开源框架初始化顺序
查看>>
Spark修炼之道(进阶篇)——Spark入门到精通:第五节 Spark编程模型(二)
查看>>
一线架构师实践指南:云时代下双活零切换的七大关键点
查看>>