内存管理

iOS 内存管理

℡╲_俬逩灬. 提交于 2020-02-04 03:58:51
本篇随笔记录的是看唐巧写的「iOS开发进阶」书籍的「理解内存管理」知识点汇总,这里分享给大家。 Objective-C 和 Swift 语言的内存管理方式都是基于引用计数「Reference Counting」的,引用计数是一个简单而有效管理对象生命周期的方式。引用计数分为自动引用计数「ARC: Automatic Reference Counting」和手动引用计数「MRC: Manual Reference Counting」,现在都是用 ARC 了,但是我们还是很有必要了解 MRC。 1. 引用计数的原理是什么? 当我们创建一个新对象时,他的引用计数为1; 当有一个新的指针指向这个对象时,他的引用计数就加1; 当对象关联的某个指针不再指向他时,他的引用计数就减1; 当对象的引用计数为0时,说明此对象不再被任何指针指向,这时我们就可以将对象销毁,回收内存。 由于引用计数简单有效,除了 Objective-C 语言外,Microsoft 的 COM「Component Object Model」、C++11(基于引用计数的智能指针 share_prt)等语言也提供了基于引用计数的内存管理方式。 举个例子: 新建工程,Xcode 默认开启的是 ARC,我们这里针对「AppDelegate.m」文件使用 MRC,进行以下配置: 选择目标工程,然后在「Build Phases」的

IOS 内存管理

我只是一个虾纸丫 提交于 2020-02-04 03:03:11
小议iphone内存管理与属性 一、前言 对于大多数从C++或者JAVA转过来学习Object-C(以下简称OC)的人来说,OC这门语言看起来非常奇怪,用起来也有点麻烦。 OC没有像JAVA一样的垃圾回收机制,也就是说,OC编程需要程序员手动去管理内存。这就是为什么它烦的原因,苹果却一直推崇开发者在有限硬件资源内写出最优化的代码,使用CPU最少,占用内存最小。 二、基本原理 对象的创建: OC在创建对象时,不会直接返回该对象,而是返回一个指向对象的指针,因此出来基本类型以外,我们在OC中基本上都在使用指针。 ClassA *a = [[ClassA alloc] init]; 在[ClassA alloc]的时候,已经发送消息通知系统给ClassA的对象分配内存空间,并且返回了指向未初始化的对象的一个指针。 未初始化的ClassA对象接手到init消息,init返回指向已初始化后的ClassA对象的一个指针,然后将其赋值给变量a。 在创建并使用完一个对象的时候,用户需要手动地去释放该对象。 [a dealloc]; 如果指针a和b同时指向堆中同一块内存地址 ClassA *a = [[ClassA alloc] init]; ClassA *b = a; [a dealloc]; 当执行到第三行的时候,指针b就成了无头指针。这是一个在C++中也是常见的错误,我们需要避免这类错误

AJPFX的内存管理小结

本小妞迷上赌 提交于 2020-02-04 01:19:02
管理范围:任何继承于 NSObject的对象 原理: 每一个对象都有引用计数器 当使用alloc new 和 copy创建对象时引用计数器被设置为1 给对象发送一条retain消息 ,引用计数器加1 — 给对象发送一条relrase消息,引用计数器会减1 计数器为0时,对象会被回收 只要用alloc new创建新对象,那么你就有责任做一次release 不可以再操作已经被释放的对象,不然会发生野指针错误 在对象释放前操作对象 你想使用某个对象,就应该放对象的计数器+1 你不想使用某个对象,就应该让对象的计数器-1 成员变量内存管理(如果成员变量是对象,才需要管理) 哪里有 alloc new 哪里有 release release 旧对象 retain新对象 dealloc 方法就是释放当前拥有的所有对象 nonatomic:性能高 多线程不加锁 —诺米拖米克 atomic 性能低,多线程加锁 -啊拖你克 autorelease 会将对象放到一个自动释放池中 当自动释放池被销毁,会将池里的所有对象的一次release操作 来源: https://www.cnblogs.com/AJPFX/p/10891258.html

C语言内存管理

血红的双手。 提交于 2020-02-03 13:48:10
一、计算机存储结构说明 由于现阶段的存储器件都是速度越快,价格越贵,所以按照合理的布局和价格考虑,计算机系统都是使用的层级的存储结构布局。这样的布局再加上相应的 存储管理单元 构成现在的计算机存储系统。 二、c语言主要存储结构 c语言的存储结构一般分为5个主要区域,分别是:栈,堆,代码段,数据段(全局数据区),未初始化全局数据区(BSS) 各区的存储内容如下所示: *栈:* 一般存储局部变量,函数参数以及程序切换时的现场保护信息。 栈的管理全部由 操作系统 负责,相关存储分配和释放都操作系统根据程序的情况进行分配。 一般采用小端模式进行存储,存储方向是数据高位存储在高地址位置。 该区进行数据访问的时候,由于是直接使用变量标识符进行的访问,所以访问速度很快。 由于存储管理是操作系统进行的,所以该区使用的时候模式固定,不会出现内存碎片。 *堆:* 动态存储区,一般存储动态相关的变量,C语言中通过malloc和free程序来进行申请和释放,该部分内存管理都是由程序员自己管理的。 在程序执行的时候,遇到动态内存分配函数malloc的调用的时候,操作系统才会根据系统内存储情况对申请的内存进行分配。 一般采用大端模式进行存储,存储方向是数据高位存储在低地址位置。该区进行数据访问的时候,只能通过对应的 指针 进行访问,访问速度较慢。 该区管理由程序员自己管理,使用比较灵活,但是如果管理不好

Java虚拟机

穿精又带淫゛_ 提交于 2020-02-03 12:25:42
jvm的框架结构:jvm在运行时会产生一个运行时数据区,里面包含了方法区,Java堆,虚拟机栈,本地方法栈,程序计数器等5个模块,其中,Java堆主要用来存放Java对象实例(Java虚拟机规范写:class,instances,arrays),另外,Java堆会划分多个线程私有分配缓冲区来进行内存管理。Java堆被垃圾收集器(GC)所管理,就是说Java堆里面的内存会被GC自动管理。 来源: CSDN 作者: 过圣诞节的小马哥 链接: https://blog.csdn.net/qq_40236645/article/details/90237272

c的动态内存管理

房东的猫 提交于 2020-02-02 07:59:51
一、动态内存分配 1、 c语言中动态内存分配的步骤: (1) 用mallocl类的函数分配内存; (2) 用这些内存支持应用程序; (3) 用free函数释放内存 例如: 2、 内存泄露 如果不再使用已分配的内存却没有将其释放,就会发生内存泄露,导致内存泄露的情况可能如下: (1) 丢失内存地址 在上图中,pi重新分配地址,原来指向的地址丢失。 Name指向的初始内存地址丢失 (2) 应该调用free函数却没有调用 对于这种情况,尤其需要注意:指向结构体的情况,如果一个结构体内部有动态指针,在释放结构体指针的时候需要释放结构体内部的动态指针。 3、 动态分配内存函数 (1) malloc函数从堆上分配一块内存,所分配的字节数由该函数唯一的参数指定,返回值是void指针,如果内存不足,就会返回NULL,否则返回首字节地址,新分配的内存包含垃圾数据。 初始化静态或全局变量时不能调用函数,(但是貌似用vs2012 没有报错) (2) 使用calloc分配内存 Calloc会在分配的同时清空内存,清空内存的意思是将其内容置为二进制0.函数的原型是: Calloc函数会根据numElements和elementSize两个参数的乘积分配内存,并返回一个指向内存的第一个字节的地址,如果分配失败,返回NULL。不用calloc的话,用malloc函数和memset函数可以得到同样的结果,如下

操作系统--虚拟内存学习

穿精又带淫゛_ 提交于 2020-02-02 05:49:00
内存的发展流程: 一.嵌入式实时操作系统 表现 :在早期的单片机上,程序运行在物理内存中,也就是说,程序在运行时直接访问到物理地址,在程序运行开始,将全部程序加载到内存中,所有的数据地址和程序地址就此固定。 在运行多任务系统时,比较直接的办法也是直接为每个任务分配各自需要的内存空间,比如总内存为100M,task1需要40M,task2需要50M,task3需要20M,那么最简单的办法是给task1分配40M,给task2分配50M,而task3,不好意思,内存不够了,不允许运行 弊端 : 地址空间不隔离 所有程序都可以直接访问物理内存,那么task1就可以直接访问task2的地址,这就给了一些恶意程序机会来进行一些非法操作,即使是非恶意但是有bug的程序,也可能会导致其他任务无法运行,这对于需要安全稳定的的计算机环境的用户是不能容忍的。 内存使用效率极低 由于没有有效的内存管理机制,通常在一个程序执行时,将整个程序装载进内存中运行,如果我们要运行task3,内存已经不够了,其实系统完全可以将暂时没有运行的task2先装入磁盘中,将task3装载到内存,当需要运行task2时,再将task2换回,虽然牺牲了一些执行效率,但总归是可以支持更多程序运行。 程序地址空间不确定 需要了解的是程序在编译阶段生成的可执行文件中符号地址是连续且确定的,即使实现了内存数据与磁盘的交换

Linux 内存管理三

让人想犯罪 __ 提交于 2020-02-01 19:39:33
本节主要涉及下面这些概念,搞清楚我们在linux下面写一个应用程序究竟耗费了多少内存,也是我们查内核泄漏的指标。 VSS- Virtual Set Size RSS- Resident Set Size PSS- Proportional Set Size USS- Unique Set Size 在linux 里面大量的存在内存共享的概念,比如我们的libc 库,加入我们有100个程序调用了c 库,linux会把代码段再内存里面共享给这个100个进程使用(动态连接库都是这样),我们把一个程序跑两次,程序的代码段也是共享的,当然数据段是写时拷贝的,当我们再评估一个进程耗费多少内存的时候,我们有必要搞清这些虚的,实的,以及共享的,我们说的进程的内存消耗就是指用户空间耗费的内存,内核空间耗费的内存就是内核消耗的,比如我们做了一个系统调用,这个系统调用申请了很多内存,这个写内存也不属于进程消耗 VMA 表面地址的合法性,和权限,不代表页表里面真实的权限,但是linux的页表中发生page fault时会检测vma,确定是否合法访问,如果合法,申请对应的物理地址映射过来。 这些vma 可能来自程序本身的代码段,数据段,或者动态库。 我们一般用如下方法来查看vma Linux 下各种page fault,通常分为minor page fault ,和major page fault

【C++知识】浅谈关于C++的内存管理

巧了我就是萌 提交于 2020-02-01 16:39:08
浅谈关于C++的内存管理 目录 浅谈关于C++的内存管理 1、内存管理的预备工具 malloc/free函数 new/delete表达式 array new/array delete placement new allocator分配器 2、内存管理 1、内存管理的预备工具 malloc/free函数 void* p1=malloc(512); //分配512个字节 free(p1); 对于malloc,它进行分配的内存块,除了需要申请的必要内存空间外,上下各有一个cookie,一共占8个字节,用来记录当前内存块的大小,而整个内存块的大小应该是16的倍数,所以可能还会额外增添一些其他内存空间,所以整个下来,当需要多次申请内存时,就会造成大量的内存空间浪费。 new/delete表达式 complex<int>* p2=new complex<int>; delete p2; new:实际上分为三个步骤:1) 分配内存 ,调用operator new函数,而operator new函数实际上就是调用malloc分配内存;2) 类型转换 ,对于分配内存后返回的变量进行转换成指针类型,因为new需要返回一个指针类型;3) 自动调用构造函数 。 delete:1)自动调用析构函数;2)释放内存,调用operator delete函数,而operator

深入理解Java虚拟机01:

白昼怎懂夜的黑 提交于 2020-02-01 13:09:39
“串一串” Java 虚拟机的知识点 本文将按照 Content 中给出的四个部分加上 Java 的内存模型部分进行说明,首先先来说说 Java 的内存管理机制。 说说 Java 的内存管理机制 说说 Java 虚拟机程序执行 说说虚拟机性能监控及故障处理 说说 JIT 优化 说说 Java 的内存模型 (JMM) 说说 Java 的内存管理机制 和 C++ 相比,Java 的内存管理机制可谓是一大特色,程序员们不需要自己去写代码手动释放内存了,甚至你想自己干虚拟机都不给你干这个事情的机会(就是说,我们是没有办法自动触发 GC 的),虚拟机全权包办了 Java 的内存控制权力。这看起来挺美好的,不过也意味着,一旦虚拟机疏忽了(感觉不能赖虚拟机,毕竟虚拟机也不知道你能把程序写成那样啊……),发生了内存泄漏,问题都不好查,所以知道虚拟机到底是怎么管的内存就十分重要啦。 虚拟机对内存的管理,其实就是收拾那些存放我们不会再用的对象的内存,把它们清了拿来放新的对象。所以它首先需要研究下以下几个问题: 这堆报废了的对象到底被放哪了?(Java 堆和方法区) 5 个数据区域: 程序计数器 、 Java 虚拟机栈 、 本地方法栈 、 Java 堆 、 方法区 。 这堆放报废对象的地方会不会内存泄漏?或者换一个洋气点的叫法,会不会 OOM?( 每个区的 OOM ) 对象是咋被放到这些地方的?(