如何有效降低内存峰值防止过高及其原理分析

答案就是:

在函数创建对象之前先创建一个自动释放池,因为这个释放池是函数里面的局部变量,所以当函数结束的时候,会调用他的析构函数,而普通的情况是在一帧结束的时候才会调用自动释放池(不是这个,普通的)的析构函数。基于这个背景来分析一下为什么。

1.内存峰值过高是为什么?

  在cocos2d中因为我们在一帧内创建的临时对象太多了,这些对象是占用内存的罪魁祸首,而这些对象正常情况下就算是用不到的对象也是是要在一帧结束的时候才会释放,所以就导致了内存峰值过高。

2.解决思路

  所以我们要解决一个问题,即:让用不到对象不要在一帧结束的时候才释放,而是让其提前释放,比如说超过其作用域的时候马上释放或者用不到的时候马上释放,这样就不会占用内存了。我这里采用的方法就是前者:用不到的变量在超过其作用域的时候就是房。

3.怎么释放,以及为什么这样有效果?

  释放的方法很简单,即:在函数里面创建对象之前先创建一个自动释放池。函数第一句创建了一个自动释放池,在创建的时候,这个自动释放池会被追加到了释放池栈_releasePoolStack。又因为在创建其他普通对象的时候会又一个autorelease()函数,这个函数会将新创建的对象添加到我们刚才创建的自动释放池(最新的)里面去。

当作用域结束后会调用对象的析构函数,而新加的自动释放池的作用域也是结束了,所以会调用这个自动释放池的析构函数。

自动释放池的~autoreleasePool函数(析构函数),会将这个自动释放池里面的所有对象都release一遍,所以那些用不到的变量就会自动释放掉了,

这样就实现了自动释放对象的功能。

时间: 2024-11-23 01:55:34

如何有效降低内存峰值防止过高及其原理分析的相关文章

第34条:以“自动释放池块”降低内存峰值

本条要点:(作者总结) Objective-C 对象的生命期取决于其引用计数(参见第29条).在 Objective-C 的引用计数架构中,有一项特性叫做"自动释放池"(autorelease pool).释放对象有两种方式:一种是调用 release 方法,使其保留计数立即递减:另一种是调用 autorelease 方法,将其加入 "自动释放池"中.自动释放池用于存放那些需要稍后某个时刻释放的对象.清空(drain)自动释放池时,系统会向其中的对象发送 relea

Hadoop2.7.1配置NameNode+ResourceManager高可用原理分析

关于NameNode高可靠需要配置的文件有core-site.xml和hdfs-site.xml  关于ResourceManager高可靠需要配置的文件有yarn-site.xml 逻辑结构: NameNode-HA工作原理:  在一个典型的HA集群中,最好有2台独立的机器的来配置NameNode角色,无论在任何时候,集群中只能有一个NameNode作为Active状态,而另一个是Standby状态,Active状态的NameNode负责集群中所有的客户端操作,这么设置的目的,其实HDFS底层

[转]对tableView三种计算动态行高方法的分析

tableView是一个神奇的东西,可以这么说,就算是一个初学者如果能把tableView玩的很6,那编一般的iOS的需求都问题不大了.tableView是日常开发中用烂了的控件,但是关于tableView中的自定义cell的动态行高,还是有一些玄机的.笔者本次主要是因为预估行高的方法的问题作为了一个契机顺带写了此文对几种动态行高方法的分析. 旧方法 现在常规的动态行高的计算方法还是用 [str boundingRectWithSize:size options:NSStringDrawingU

ios开发日记11 对tableView三种计算动态行高方法的分析

tableView是一个神奇的东西,可以这么说,就算是一个初学者如果能把tableView玩的很6,那编一般的iOS的需求都问题不大了.tableView是日常开发中用烂了的控件,但是关于tableView中的自定义cell的动态行高,还是有一些玄机的. AD: tableView是一个神奇的东西,可以这么说,就算是一个初学者如果能把tableView玩的很6,那编一般的iOS的需求都问题不大了.tableView是日常开发中用烂了的控件,但是关于tableView中的自定义cell的动态行高,

对tableView三种计算动态行高方法的分析

tableView是一个神奇的东西,可以这么说,就算是一个初学者如果能把tableView玩的很6,那编一般的iOS的需求都问题不大了.tableView是日常开发中用烂了的控件,但是关于tableView中的自定义cell的动态行高,还是有一些玄机的.笔者本次主要是因为预估行高的方法的问题作为了一个契机顺带写了此文对几种动态行高方法的分析. 如果你不是在董铂然博客园看到本文,请点击查看原文. 旧方法 现在常规的动态行高的计算方法还是用 [str boundingRectWithSize:siz

cpu使用率低负载高,原因分析

原因总结 产生的原因一句话总结就是:等待磁盘I/O完成的进程过多,导致进程队列长度过大,但是cpu运行的进程却很少,这样就体现到负载过大了,cpu使用率低. 下面内容是具体的原理分析:在分析负载为什么高之前先介绍下什么是负载.多任务操作系统.进程调度等相关概念. 什么是负载 什么是负载:负载就是cpu在一段时间内正在处理以及等待cpu处理的进程数之和的统计信息,也就是cpu使用队列的长度统计信息,这个数字越小越好(如果超过CPU核心*0.7就是不正常) 负载分为两大部分:CPU负载.IO负载 例

MySQL SYS CPU高的案例分析(一)

原文:MySQL SYS CPU高的案例分析(一) [现象] 最近关注MySQL CPU告警的问题时,发现有一种场景,有一些服务器最近都较频繁的出现CPU告警,其中的现象是 SYS CPU占比较高. 下面的截图来源于“MySQL CPU报警”采集的文件 [问题分析] 可以分析出这服务器CPU升高的原因是由于表的高并发写入引起.优化方案通常是通知开发停止写入或降低写入频率. 究竟是什么原因导致高并发写入时CPU sys的占比这么高. 从采集的[Perf Stat]指标看到CPU有大量消耗是集中ke

高通Quick Charge 2.0 快速充电原理分析

有些用户在安装好Android SDK后,打开Android SDK Manager下载API时一直显示"Done loading packages"却迟迟不能前进.自己也出现了这种情况,把自己成功解决此问题的方法分享给大家. 方法/步骤 用户需要首先打开已下载的安卓SDK管理器"Android SDK Manager",然后点击菜单栏中的"Tools"菜单选项,接下来只需选择"Options"选项即可打开设置窗体. 接下来,

高通Quick Charge高速充电原理分析

1 QC 2.0 1.1 高通Quick Charge 2.0 高速充电原理分析 高通的QC2.0高速充电须要手机端和充电器都要支持才行. 当将充电器端通过数据线连到手机上时,充电器默认的是将D+和D-短接的,这样手机端探測充电器类型是DCP(參见本人还有一篇博文<高通平台USB2.0和3.0接口充电器识别原理>).手机以默认的5V电压充电,接着步骤例如以下: 1) 假设手机端使能了高速充电协议.Android用户空间的hvdcp(high voltage dedicated charger