内存分配

作者: 书写不简单 | 来源:发表于2019-01-19 09:37 被阅读115次

所有进程(执行的程序)都必须占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等。不过进程对这些内存的管理方式因内存用途不一而不尽相同,有些内存是事先静态分配和统一回收的,而有些却是按需要动态分配和回收的。


image.png

内存分类(RAM、ROM)

  • RAM:运行内存,不能掉电储存;
  • ROM:储存性内存,可以掉电储存,例如:内存卡,flash;
  • RAM的访问速度要远高于ROM,价格也要高;
  • CPU只能从RAM直接读取指令;

app程序一般存放于ROM中。启动app时,系统会把开启的app程序从ROM中转移到RAM中。

内存分区

iOS中主要是栈区(stack)、堆区(heap)、全局区/静态区(staic) ;

栈区

存放局部变量,先进后出,一旦出了作用域就会被销毁,函数跳转地址,现场保护等
栈区的地址从高到低分配

堆区

堆区的内存分配使用的是alloc;
堆区的地址是从低到高分配;
ARC原理是基于堆区,编译器在编译的时候给对象自动添加retain,release,autorelease;
在ios中,堆区的内存是应用程序共享的,堆中的内存分配是系统负责的;

全局区

  • 未初始化
    在内存中是放在一起的,比如:int a;
  • 初始化
    未初始化, int a = 10

以上 2者都在全局区/静态区;

常量区

常量字符串及时放在这里的;

代码区

存放app代码;

tips:

堆区需要程序猿管理内存,是由alloc分配的内存,一般速度比较慢,容易产生内存碎片;

栈区不需要程序猿管理内存,由编译器自动分配并释放,速度快;

当一个app启动后,代码区,常量区,全局区大小都是已经固定的,因此指向这些区的指针不会产生崩溃性的错误,而堆区和栈区是时时刻刻变化的(堆得创建和销毁,栈的弹入和弹出),所以当使用一个指针指向这个2区里面内存的时候,一定要注意内存是否已经被释放,否则会产生程序崩溃(即野指针报错)

相关文章

  • 《C语言》malloc函数使用

    动态分配、静态分配 静态分配:计算机随机自动分配内存,周期结束后自动释放内存动态分配:手动分配内存,手动释放内存 ...

  • (二)C语言之动态内存分配

    (二)C语言之动态内存分配 一、静态内存分配 定义是指定分配的内存长度就是静态内存分配,是在栈内存中分配 二、C语...

  • javascript内存管理

    内存声明周期 分配你所需要的内存 使用分配的内存(读写) 不再需要时释放内存 内存分配 javascript在声明...

  • docker 的资源分配

    内存分配 -m 或者--memory :分配内存--memory-swap:分配临时内存docker run -i...

  • Java中四种引用

    Java内存管理包括内存分配和内存回收。 内存分配:程序员通过new对象,JVM会自动为该对象分配内存。 内存回收...

  • Java编程语言:java中四种引用!欢迎补充

    Java内存管理包括内存分配和内存回收。 内存分配:程序员通过new对象,JVM会自动为该对象分配内存。 内存回收...

  • 回顾JVM内存分配

    回顾JVM内存分配回顾JVM内存分配

  • 探索iOS内存分配

    探索iOS内存分配 探索iOS内存分配

  • 内存管理:部分基础知识

    一、内存分区二、常用数据类型占用内存大小三、给对象分配内存 1、给结构体分配内存及内存对齐 2、内存分配完后,内存...

  • C语言内存分配(重)

    内存分配的类型: 静态内存分配: 全局变量、静态全局变量、静态局部变量; 静态内存分配是在程序编译时分配的内存空间...

网友评论

    本文标题:内存分配

    本文链接:https://www.haomeiwen.com/subject/mpeadqtx.html