内存管理

计算机操作系统 - 内存管理

爷,独闯天下 提交于 2019-12-12 01:09:31
• Read 摘自 github CS-Notes - 计算机操作系统 一、虚拟内存 将物理内存抽象为地址空间,每个进程都有各自的地址空间,地址空间被分割成多个块, 每一块称为一页 。这些页被 映射到物理内存 ,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。目的是让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。 1、分页系统地址映射 内存管理单元负责地址空间和物理内存的转换,其中页表存储着 页(程序地址空间) 和 页框(物理内存空间) 的映射表。一个虚拟地址分为 页面号 (16位地址是前4位)和 存储偏移量 。页面号的十进制数对应页表的索引,一个页表项最后一位表示是否存在于内存,前几位即为页框的前几位。 2、页面置换算法 在程序运行过程中,如果要访问的页面不在内存中,就发生缺页中断从而 将该页调入内存 中。此时如果内存已无空闲空间,系统必须从内存中 调出一个页面到磁盘对换区 中来腾出空间。 页面置换算法的主要目的就是 使页面置换频率最低 。 大专栏 计算机操作系统 - 内存管理 > 最佳 (OPT):所选择的被换出的页面将是最长时间内不再被访问(理论上不知道将来使用页面的情况) 最近最久未使用( LRU):通过维护链表保证表尾的页面是最近最久未访问的,代价很高 最近未使用 :每个页面有 R 和 M 两个状态位 先进先出

Redis设计思路学习与总结

你。 提交于 2019-12-11 08:49:46
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 版权声明:本文由宋增宽原创文章,转载请注明出处: 文章原文链接: https://www.qcloud.com/community/article/222 来源:腾云阁 https://www.qcloud.com/community 宋增宽,腾讯工程师,16年毕业加入腾讯,从事海量服务后台设计与研发工作,现在负责QQ群后台等项目,喜欢研究技术,并思考技术演变,专注于高并发业务架构的设计与性能优化。 下半年利用空余时间研究和分析了部分Redis源码,本文从网络模型、数据结构和内存管理、持久化和多机协作四个角度对redis的设计思路进行了分析,若有不正确之处,希望各路大神指出。 Redis是业界普遍应用的缓存组件,研究一个组件框架,最直观的办法就是从应用方的角度出发,将每个步骤的考虑一番,从这些步骤入手去研究往往能够最快的体会到一个组件框架的设计哲学。以Redis为例,每当发起一条请求时,redis是如何管理管理网络请求,收到请求后又是通过什么样的数据结构进行组织并操作内存,这些数据又是如何dump到磁盘实现持久化,再到多机环境下如何同步和保证一致性……本文就是从网络模型、数据结构设计与内存管理、持久化方法和多机四个角度简要描述了redis的设计和自己的一点体会。 一.网络模型

objective-c 面试题

隐身守侯 提交于 2019-12-10 15:26:40
1. objc的内存管理: bjec内存管理采用引用计数的方式。 当你使用new,alloc或copy创建对象时, 对象的引用计数由0自增到1, 调用release方法之后对象的引用计数减一,当且 仅当对象的引用计数为0的时候dealloc方法将被自动调用, 所以,我们应该尽量避免手动调用dealloc方法。 因为可能代码的其他地方还存在对该对象的引用,调用dealloc方法将该对象释放之后可能会造成对该对象的非法引用而导致程序崩溃。 以下是有关objc对象的内存管理的一些API: 1 ,alloc, allocWithZone,new(带初始化) 为对象分配内存,retainCount为“1”,并返回此类的一个实例对象 。 2 ,release retainCount 减“1”,减到“0”时将自动调用此对象的dealloc方法 。 3 ,retain retainCount 加“1” 4 ,copy,mutableCopy 复制一个实例,retainCount数为“1”,返回此实例。所得到的对象是与其它上下文无关的,独立的对象(干净对象)。 5 ,autorelease 在当前上下文的AutoreleasePool栈顶的autoreleasePool实例添加此对象,由于它的引入使Objective-C(非GC管理环境)由全手动内存管理上升到半自动化。 2. retain,

OS内存管理相关实现(原题: Linux中的内存管理)

风格不统一 提交于 2019-12-10 15:13:39
前一段时间看了《深入理解Linux内核》对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看法和认识。 我比较喜欢搞清楚一个技术本身的发展历程,简而言之就是这个技术是怎么发展而来的,在这个技术之前存在哪些技术,这些技术有哪些特点,为什么会被目前的技术所取代,而目前的技术又解决了之前的技术所存在的哪些问题。弄清楚了这些,我们才能比较清晰的把握某一项技术。有些资料在介绍某个概念的时候直接就介绍这个概念的意义,原理,而对其发展过程和背后的原理丝毫不提,仿佛这个技术从天上掉下来的一样。介于此,还是以内存管理的发展历程来讲述今天的主题。 首先,我必须要阐述一下这篇文章的主题是Linux内存管理中的分段和分页技术。 让我们来回顾一下历史,在早期的计算机中,程序是直接运行在物理内存上的。换句话说,就是程序在运行的过程中访问的都是物理地址。如果这个系统只运行一个程序,那么只要这个程序所需的内存不要超过该机器的物理内存就不会出现问题,我们也就不需要考虑内存管理这个麻烦事了,反正就你一个程序,就这么点内存,吃不吃得饱那是你的事情了。然而现在的系统都是支持多任务,多进程的,这样CPU以及其他硬件的利用率会更高,这个时候我们就要考虑到将系统内有限的物理内存如何及时有效的分配给多个程序了

Core Foundation

瘦欲@ 提交于 2019-12-10 14:53:14
Swift中的 Core Foundation 类型是一个成熟的类。当出现内存管理注释时,Swift 会自动地管理 Core Foundation 对象的内存,这其中包括你实例化了的 Core Foundation 对象。在 Swift 中,你可以自由变换 Fundation 和 Core Foundation 类型。如果你想先转换为桥接 Foundation 类型时,你也可以桥接一些 toll-free bridged Core Foundation 类型到 Swift 标准库类型。 重定义类型 当 Swift 导入 Core Foundation 类型时,编译器会重映射导入的类型名字。编译器会从每个类型名字的末端移除Ref,这是因为所有的 Swift 类都属于引用类型,因此后缀是多余的。 Core Foundation 中的CFTypeRef类型会对Anyobject类型重映射。所以你以前使用的CFTypeRef,现在该换成AnyObject了。 内存管理对象 在 Swift 中,从 annotated APIs 返回的 Core Foundation 对象能够自动进行内存管理--你不再需要调用自身的CFRetain,CFRelease,或者CFAutorelease函数。如果你从自身的C函数和 Objective-C 方法中返回一个 Core Foundation 对象

iOS中的内存管理(上)

天大地大妈咪最大 提交于 2019-12-10 14:22:07
下列行为都会增加一个app的内存占用: 1、创建一个OC对象; 2、定义一个变量; 3、调用一个函数或者方法。 如果app占用内存过大,系统可能会强制关闭app,造成闪退现象,影响用户体验。如何让回收那些不再使用的对象呢?本文着重介绍OC中的内存管理。 所谓内存管理,就是对内存进行管理,涉及的操作有: 1、分配内存:比如创建一个对象,会增加内存占用; 2、清除内存:比如销毁一个对象,会减少内存占用。 内存管理的管理范围: 1、任何继承了NSObject的对象; 2、对其他非对象类型无效(int、char、float、double、struct、enum等) 只有OC对象才需要进行内存管理的本质原因: 1、OC对象存放于堆里; 2、非OC对象一般放在栈里面(栈内存会被系统自动回收) 系统是如何判断什么时候需要回收一个对象所占用的内存呢?在这里涉及到对象的“引用计数器”的概念。 引用计数器: 每个OC对象都有自己的引用计数器,它是一个整数;每个OC对象内部都有4个字节的存储空间来存放引用计数器。 从字面上看,引用计数器可以理解为“对象被引用的次数”。 简单来说,可以理解为: 引用计数器 表示有多少人正在使用这个对象。 当没有任何人使用这个对象时,系统才会回收这个对象;也就是说: 1、当对象的引用计数器为0时,对象占用的内存就会被系统回收; 2、如果对象的计数器不为0

OC 内存管理

﹥>﹥吖頭↗ 提交于 2019-12-10 14:02:38
引用计数的相关内容 ✓ OC中内存管理机制就是引用计数 ✓ 每个对象都有引用计数,理论上如果对象的引用计数为0, 它就会自动释放对象,系统会回收它开辟的内存空间 ✓ 在实际的开发中,存在多个指针指向同一个对象 2.影响引用计数的一些方法 使引用计数加1的方法(alloc,retain,copy,NSString的直接赋值字符串等) retainCount是查看引用计数的次数的一个参考,不绝对. 注意:当引用计数被释放为0时,retainCount打印出来还是1,理论上是0 release 是释放的方法,即引用计数减1 注意:系统释放完了之后,理论上是会被销毁的,然后释放相应的内存,但是为了避免野指针的现象,所以我们在后面常常加入置空,即将指针地址nil autorelease也是使引用计数减1,但是他不是立即执行,而是在指向了[pool autorelease]语句之后才会减1;当然如果用系统的自动释放池,或者自己建立自动释放池,在里面指向了引用计数加的时候,如果没有释放,然后会在自动释放池外,全部统一销毁 如果你想比较安全的使用对象,可以通过retain这个方法将这个对象持有,增加引用计数;如果不想使用这个对象,也就是销毁,可以使用release,减少它的引用计数 特别强调:管理内存的核心就是使内存保持平衡 .内存始终遵循的一大准则就是平衡原则 如果引用计数没有在保证平衡的原则

oc的内存管理机制.及自动释放池的解析

安稳与你 提交于 2019-12-10 13:47:04
一.内存管理的方式 MRC 人工引用计数:内存的开辟和释放由程序代码无师自通控制,() ARC 自动引用计数(不是自动内存管理)(编译器帮助程序员默认加了释放代码) 在C中使用malloc和free oc中内存管理的机制 oc中提供了一个“引用计数”的机制来管理内存的。 每一个对象都有一个引用计数,对象在建立的时候引用计数为1,当引用计数为0的时候,对象将被系统统一销毁,我们可以通过调用一些方法来操作引用计数的值。 引用计数加1的方法有 alloc copy retain 以及其他类或对象的强引用,在arc中strong 相当于原来的 retain,weak相当于原来的assign,成员变量是弱指针. alloc 为一个新对象分配内存,并且它的引用计数为1,调用alloc方法,你便有对新对象的所有权 copy 制造一个对象的副本,该副本的引用计数为1,调用者具有对副本的所有 权 retain 使对象的引用计数加1,并且获得对象的所有权 放弃所有权的方法: release 使对象的引用计数减1,并且放弃对象的所有权 autorelease 使对象的引用计数在未来 的某个 时候 减1,并且在那个时候 放弃对象的所有权 注:arc中不允许调用release ,retain retainCount, 内存管理对于C语言基本类型无效. 所有oc对象都有一个计数器,保留着当前被引用的数量.

cocos2d-x3.2 内存管理

烈酒焚心 提交于 2019-12-10 09:22:49
图片缓存没去掉,这游戏里面普遍的问题。TextureCache::removeUnusedTextures这个方法只有在纹理计数为1的时候才会移除内存中缓存的Texture。这里有一个问题要先说一下:当我们创建一个精灵的时候,这张精灵所使用的Texture是会加载到内存中缓存着的。一旦你再次创建一个使用相同纹理的精灵,这个时候如果内存中还存在这张纹理的缓存,就会直接取出,而不用重新创建。当一个精灵创建的时候,在其内部调用addImage方法的时候,把引用计数做了+1处理,此时引用计数为2.当移除这个精灵的时候,引用计数会-1,这个时候引用计数为1。若此时你调用了TextureCache::removeUnusedTextures的方法。那这张纹理将从内存中移除。但是若是像之前说的,有两个精灵同时使用了这张问题,那该纹理的引用计数为3,必须两个精灵都移除后,才能释放内存。 这边还有一点很重的是:只有在removeChild的时候,引用计数才会做-1处理,而cocos的removeChild是没有对其子节点进行remove处理的,也就是说,子节点中对于Texture的引用计数仍在,导致TextureCache::removeUnusedTextures的时候,纹理没办法有效的移除。 所以这里建议的方案是: 1.在移除一个节点之前,先遍历移除其子节点,释放引用计数 2

聊一聊内存管理(2)

末鹿安然 提交于 2019-12-10 04:21:11
在上一讲我们给大家重点介绍了什么是内存管理,让大家对内存管理有了整体的认识。简单来说就是,程序的运行需要内存,你如何管理并给这些程序分配内存。 本节我们来给大家介绍最简单的一种内存管理方案:单一连续区分配。为什么说这种内存分配是最简单的呢?接下来我们就做详细的介绍。 单一连续区内存分配的基本思想是一段时间内只有一个进程在内存。我们将4G的内存分为两部分,一部分存放操作系统内核,另外一部分存放用户程序,且一段时间内只有一个用户程序在内存中。如图1-1所示: 图1- 1 单一连续区内存分配 T1时刻有进程P1,需要512MB的内存,那么将内存分配给P1,如图1-2所示; T2时刻有进程P2,需要1GB的内存,由于单一连续区内存分配的特点,此时用户区已经有了P1在执行,即时剩余内存充足,P2也无法运行,只有在P1运行结束并释放内存之后才能运行P2。 图1- 2 进程 P1的内存分布 从上面的分析大家可以看到这种内存分配方式非常的简单,可以说没有什么方法比这种还要简单的了。但是缺点也非常明显: 一段时间内只能运行一个程序,因此无法实现多道程序; 在运行一个进程后,即使有足够的剩余内存也无法执行新的进程,而只有等待该进程运行结束后才能继续执行,因此内存的利用率相当的低; 如果进程所需的内存大于用户程序的总大小,则该进程将无法得到运行,因此对要运行的进程有很大的限制条件