Cocoa框架中的内存分区
NSObject对象类实例为我们提供了两种分配内存的方式:alloc和allocWithZone:。alloc的实现也是为了调用allocWitZone:,它传入了一个默认的zone。所以明确的说,NSObject提供了一种分配内存的方式。什么是zone?为什么要使用zone?
Zone代表了内存中的一段连续的内存区域。当我们需要创建一些具有相同访问模式以及生命周期的对象时,我们可以采用Zone让这些对象在计算机的地址空间中保持相邻的位置,这样可以提高应用程序的性能。要搞清楚对象在内存中的位置如何影响性能,我们需要知道虚拟内存以及当应用程序请求了比实际物理内存大的内存时,系统会发生什么事情?
这些知识已经在之前的博客中有过提及,这里仅仅是简单的表述。注意:下面的表述适用于OS X系统,IOS由于处理方式不一样,但是原理大致一样,就不在此提及。
当应用程序请求了一块内存,但是系统发现物理内存已经使用完毕,没有内存可供使用时,会触发一个页面调度程序将那些暂时不用的对象objectA的数据从内存中置换到backing store中,然后将这部分内存分配给内存请求方objectB。当objectB使用完毕后,假如objectA马上又请求内存,虚拟内存管理系统发现之前有数据置换到backing store,会尝试将这些数据置换回内存,同时也可能将objectB的数据置换到backing store,当然也与可能置换其它的对象的数据,具体置换那些根据内存使用情况而定。如果应用程序在频繁的调用objectA和objectB,那么操作系统就会频繁的使用页面置换,这十分影响性能。另外如果两个对象对应的虚拟内存位置不连续,那么这两个对象触发页面置换的可能性会非常大,因为系统一般会将一段连续的内存加载进来。
分区确保了分配给要同时使用的对象位于相邻的位置。当使用某个对象时,另外的对象基本也会用到,因为这些对象位于同一个分区,那么所有对象同时调入内存的可能性就更大。
Cocoa提供了一些管理内存区域的函数。例如:NSDefaultMallZone(),NSCreateZone()以及NSRecycleZone()。当然,这些东西使用的比较少,我们可能只需要了解就可以了,在将来有用处时可以考虑是否使用。
Cocoa框架中的内存分区的更多相关文章
- NSPredicate用法总结(Cocoa框架中的NSPredicate用于查询,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取)
简述:Cocoa框架中的NSPredicate用于查询,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取. 定义(最常用到的方法): NSPredicate *ca = [NSPred ...
- JVM中的内存分区简介
1.JVM的内存区域划分: 大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) ...
- Objective-C中的内存管理——手动内存管理
一.引用计数(retainCount) 1.内存的申请 alloc和new是Objective-C语言中申请内存的两种常用方式. 当我们向一个类对象发送一个alloc消息的时候,其会向操作系统在堆中申 ...
- Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式
Linux就这个范儿 第15章 七种武器 linux 同步IO: sync.fsync与fdatasync Linux中的内存大页面huge page/large page David Cut ...
- Cocoa 框架 For iOS(一) 框架的介绍,Objectivie-C运行时能力的解析等 (转载)
http://blog.csdn.net/totogo2010/article/details/8081253 Cocoa框架是iOS应用程序的基础,了解Cocoa框架,对开发iOS应用有很大的帮助. ...
- .NET 4.0中使用内存映射文件实现进程通讯
操作系统很早就开始使用内存映射文件(Memory Mapped File)来作为进程间的共享存储区,这是一种非常高效的进程通讯手段.Win32 API中也包含有创建内存映射文件的函数,然而,这些函数都 ...
- Objective-C入门 简介Cocoa框架
Cocoa Framework简称Cocoa,它是Mac OS X上的快速应用程序开发(RAD, Rapid Application Development)框架,一个高度面向对象的(Object O ...
- cocoa框架 for iOS
1.Cocoa是什么? Cocoa是OS X和 iOS操作系统的程序的运行环境. 是什么因素使一个程序成为Cocoa程序呢?不是编程语言,因为在Cocoa开发中你可以使用各种语言:也不是开发工具,你可 ...
- iOS程序中的内存分配 栈区堆区全局区
在计算机系统中,运行的应用程序的数据都是保存在内存中的,不同类型的数据,保存的内存区域不同.一.内存分区 栈区(stack) 由编译器自动分配并释放,存放函数的参数值,局部变量等.栈是系统数据结构,对 ...
随机推荐
- Apache POI 合并单元格
合并单元格所使用的方法: sheet.addMergedRegion( CellRangeAddress cellRangeAddress ); CellRangeAddress 对象的构造 ...
- 关于struts2 验证框架在联网的时候可以用,不联网不起作用的问题
这是一个让我很头痛的问题,我是在一个其他的项目框架的基础上来开发新的项目. 当使用struts验证框架时,突然发现这个验证不起作用了,我就纳闷了之前用这个开发的项目好好的怎么到我这就不能用了呢? xm ...
- Codeforces Round #329 (Div. 2) B. Anton and Lines 逆序对
B. Anton and Lines Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/593/pr ...
- Android 滑动效果进阶篇(六)—— 倒影效果
上篇介绍了使用Animation实现3D动画旋转翻页效果,现在介绍图片倒影实现,先看效果图 本示例主要通过自定义Gallery和ImageAdapter(继承自BaseAdapter)实现 1.倒影绘 ...
- Android实现图表绘制和展示
本文演示在Android平台中绘制和展示图表示例,本示例是基于RChart 2实现的. 在一个系统中经常要用到图表统计数据,在WEB开发中图表绘制是一件简单的事情,因为有比较多的开源方案.但在Andr ...
- iOS开发——网络Swift篇&NSURL进行数据请求(POST与GET)
NSURL进行数据请求(POST与GET) 使用Swift进行iOS开发时,不可避免的要进行远程的数据获取和提交. 其数据请求的方式既可能是POST也可能是GET.同不管是POST还是GET又可以 ...
- JUnit中测试异常抛出的方法
最近在做TWU关于TDD的作业,对JUnit中测试异常抛出的方法进行了一些学习和思考. 在进行单元测试的时候有的时候需要测试某一方法是否抛出了正确的异常.例如,我有一个方法,里面对一个List进行读取 ...
- 僵尸进程 图解 分布式 LINUX内核
http://blog.csdn.net/chdhust/article/details/11872467 服务器进程为何通常fork()两次
- NopCommerce 数据库初始化
NopCommerce数据库初始化比较复杂,我简化了,只初始化创建一张表,不多说,直接上代码: //数据实体 /// <summary> /// Represents an affilia ...
- PHP生成条形码
前阵子在做一个商家优惠券的功能,需要用到条形码,于是将资料重新整理下. 1.什么是条形码? 百度百科定义:条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息 ...