Best Practices for Performance_1、2 memory、Tips 性能和小的优化点、 onTrimMemory
http://developer.android.com/training/articles/memory.html
http://developer.android.com/tools/debugging/debugging-memory.html
Managing Your App's Memory
内存宝贵,虽然有虚拟机的GC机制,但app还是要关注内存的分配和释放。 避免内存泄露, 在合适的时机释放对象的引用
Android 没有给内存提供交换空间,但是使用到了paging 和 memory-mapping 技术来管理内存。
Android does not offer swap space for memory, but it does use paging and memory-mapping (mmapping) to manage memory. This means that any memory you modify—whether by allocating new objects or touching mmapped pages—remains resident in RAM and cannot be paged out. So the only way to completely release memory from your app is to release object references you may be holding, making the memory available to the garbage collector. That is with one exception: any files mmapped in without modification, such as code, can be paged out of RAM if the system wants to use that memory elsewhere.
内存共享
android系统会跨进程共享一些RAM pages:
.每一个app的进程都是从一个叫 Zygote 的进程 fork 出来的。Zygote 进程在系统 boot,加载通用的framework代码和resources的时候启动。启动一个新的app进程时,系统会从Zygote进程fork一个进程出来,并加载和运行app的代码,这样分配给framework层大部分代码和resources的内存页就可以在所有的app进程间共享。
.大部分静态数据可以跨进程共享而且可以在需要的时候被paged out,静态数据如:Dalvik 代码;app的resources;和.so库中的native代码。
.在很多系统功能实现的时候也用到了共享内存,比如 cursor缓冲区就在content provider和client之间使用了共享内存。
由于共享内存的广泛使用,在计算一个app占用了多少内存的时候就需要仔细的区分。
Proportional Set Size (PSS), which accounts for both dirty and clean pages that are shared with other processes
app退出的时候,进程并没有退出,而是放在一个LRU缓存中,以便app下次能快速的启动。系统内存不足时会结束里面的进程来释放内存。根据LRU,进程优先级,内存消耗多少等因素来决定kill进程的顺序。
当app中有service的时候,只在其需要工作的时候才启动它,并注意不要忘了停止它。因为service会影响app进程的优先级。 推荐用 IntentService 。在非必要的时候让一个service一直运行是 one of the worst memory-management mistakes an Android app can make.
在界面隐藏的时候释放非必须的内存。 可以监听 activity的 onTrimMemory(TRIM_MEMORY_UI_HIDDEN).
它只在切换到其他app的时候才会调用,不同于onStop 在同一个app不同activity切换也会调用。
public abstract void onTrimMemory (int level); Added in API level 14.
注意图片的内存管理。
选择合适的数据容器,比如SparseArray,SparseBooleanArray等消耗的内存比HashMap要少。
Android 里面 Enum消耗的内存是静态常量的2倍以上,不推荐使用。
Java 中每一个类,包括匿名的内部类,消耗大约500字节的代码内存。 类越多,对象越多消耗内存越多,而且导致难分析。
抽象类和方法会消耗更多的内存和运算,非必须不要用。
如果用到了protobuf,使用其Nano 版本,因为通常的protobuf会生成非常冗繁的代码,占用内存,降低效率,甚至很快超过 DEX symbol limit。
注意依赖注入库的使用,Avoid dependency injection frameworks,比如 Guice or RoboGuice。
注意第三方的外部库的使用。
优化全局的性能。
使用proguard和zipalign可以提高性能。
开发过程中分析内存的使用。
考虑使用多个进程,大部分app不适应于这样做,但是音乐播放等可以考虑将播放和UI分为两个进程。
<service android:name=".PlaybackService" android:process=":background" />
Your process name should begin with a colon (':') to ensure that the process remains private to your app.
Tips
http://developer.android.com/training/best-performance.html
是一些小的优化点,虽然并不会立即带来显著的性能提升,但很多小优化点组合起来就有可能影响app全局的性能,要大幅提高性能还是应该着眼于正确的算法和数据结构。这些优化点可以作为平时写高效代码的好习惯。
两个基本原则:
.Don't do work that you don't need to do.
.Don't allocate memory if you can avoid it.
.避免创建非必要的对象。 频繁的创建临时对象会导致GC频繁运行。多用StringBuffer来处理字符串,int[]效率比Integer[]高。
.如果类的方法不访问成员变量,把它改为类的静态static方法,可以提高 15-20%的效率。
.对基本数据类型和String类型的常量,使用static final 效率很高,尽量多的用,避免使用Enum。
.在类的内部访问成员变量时,不要使用getter/setter 方法,而应该直接使用,在C++等语言中是好习惯因为有内联函数,但在Android中不推荐。直接访问在无JIT时快3倍,有JIT快7倍。用ProGuard会进行优化,内联getter/setter.
.对数组,for (A a : a)的循环速度比较快,对ArrayList 用 for (int i = 0; i < len; ++i) 比较快。
.在内部类中访问外部类的 private 成员和方法时,会编译生成一系列的静态辅助方法,降低了效率。如果非必须,可以将私有属性设为默认的"包访问"权限,或者 public,来解决这个问题。
.整型比浮点型运算效率高。
.某些Java库函数比自己实现效率更高。比如System.arraycopy(), String.indexOf()等比循环自己实现效率高。
.谨慎的使用Native函数。使用native代码并非性能一定比用java高:Java-native需要转换过程,资源分配释放管理困难,不同的架构需要重新编译,甚至相同架构下不同的机器也需要不同版本的so库。 Native代码通常是为了将已有的代码使用到android才引入,而不是为了加速某部分代码而用Native代码去实现。
.在没有JIT时,函数调用传参时使用明确的类型,比使用interface 要快6%左右,使用JIT差别很小。 在没有JIT时,缓存成员变量,比每次直接使用,速度快20%左右,使用JIT时差别很小。所以除非可读性的原因,可以不必优化。 (在源码中看到很多,在方法中不直接使用对象属性,而用final xx = mXX; 的形式,使用本地的变量。)
Best Practices for Performance_1、2 memory、Tips 性能和小的优化点、 onTrimMemory的更多相关文章
- 大型php网站性能和并发访问优化方案(转载自php中文网)
网站性能优化对于大型网站来说非常重要,一个网站的访问打开速度影响着用户体验度,网站访问速度慢会造成高跳出率,小网站很好解决,那对于大型网站由于栏目多,图片和图像都比较庞大,那该怎 ...
- mysql性能调优——Query优化
上节谈了关于mysql锁定机制的优化方案,下面来谈一下Query优化——Mysql Query Optimizer 当Mysql Query Optimizer接受到从Query Parser过来的Q ...
- 大型php网站性能和并发访问优化方案
网站性能优化对于大型网站来说非常重要,一个网站的访问打开速度影响着用户体验度,网站访问速度慢会造成高跳出率,小网站很好解决,那对于大型网站由于栏目多,图片和图像都比较庞大,那该怎么进行整体性能优化呢? ...
- Web服务器性能监控分析与优化
Web服务器性能监控分析与优化 http://www.docin.com/p-759040698.html
- 10个提升MySQL性能的小技巧
从工作量分析到索引的三条规则,这些专家见解肯定会让您的MySQL服务器尖叫. 在所有的关系数据库中,MySQL已经被证明了完全是一头野兽,只要通知停止运行就绝对不会让你多等一秒钟,使你的应用置于困境之 ...
- Kafka性能调优 - Kafka优化的方法
今天,我们将讨论Kafka Performance Tuning.在本文“Kafka性能调优”中,我们将描述在设置集群配置时需要注意的配置.此外,我们将讨论Tuning Kafka Producers ...
- 关于redis性能问题分析和优化
一.如何查看Redis性能 info命令输出的数据可以分为10个分类,分别是: server,clients,memory,persistence,stats,replication,cpu,comm ...
- 前端性能和加载体验优化实践(附:PWA、离线包、内存优化、预渲染)
一.背景:页面为何会卡? 1.1 等待时间长(性能) 项目本身包/第三方脚本比较大. JavaScript 执行阻塞页面加载. 图片体积大且多. 特别是对于首屏资源加载中的白屏时间,用户等待的时间就越 ...
- CSS性能分析,如何优化CSS提高性能
不负十年后的自己,共勉! 前端性能优化一直是一个比较热门的话题,我们总是在尽我们最大的努力去,提高我们的页面性能,比如减少HTTP请求,利用工具对资源进行合并压缩,脚本置底,避免重复请求,css sp ...
随机推荐
- 【转】深入理解JavaScript闭包闭包(closure) (closure)
一.什么是闭包?"官方"的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.相信很少有人能直接看懂这句话,因为他描述 ...
- php基础的一点注意事项
1.要弄懂"~"运算符的计算方法,首先必须明白二进制数在内存中的存放形式,二进制数在内存中是以补码的形式存放的 另外正数和负数的补码不一样,正数的补码,反码都是其本身,即: 正数9 ...
- Win8 安装 Scrapy
安装Python2.7.11 32位(自带pip) 使用如下命令更新pip python -m pip install -U pip 下载lxml,建议32位,直接安装 https://pypi.py ...
- 【搬砖】【Python数据分析】Pycharm中plot绘图不能显示出来
最近在看<Python数据分析>这本书,而自己写代码一直用的是Pycharm,在练习的时候就碰到了plot()绘图不能显示出来的问题.网上翻了一下找到知乎上一篇回答,试了一下好像不行,而且 ...
- OD调试15
可以达到不脱壳的妙用.含义:把补丁写入程序代码,就叫内嵌补丁 那我们先看看今天的程序 是一个写DVD目录的程序,点continue就可以进入使用了 发现一个还有29天 就过期了 ,点en ...
- Sql Server 之 for xml (path,raw,auto,root)
1.for xml path('str') select ID,CreateTime from dbo.ArticleInfo for xml Path('mytitle') 结果:(注意:如果是s ...
- EMV文档:接收到的ATR不在EMV规定范围,终端需要的操作
Required terminal behaviour in the event that a terminal receives characters outside the range allow ...
- Ubuntu vi 常用命令集合
:w 保存文件但不退出vi:w file 将修改另外保存到file中,不退出vi:w! 强制保存,不推出vi:wq 保存文件并退出vi:wq! 强制保存文件,并退出viq: 不保存文件,退出vi:q! ...
- nginx-1.7.9快速启动连接手机测移动端页面
大家好,本人之前用nginx熟熟的,后来一段时间不用,当今天再次想使用的时候,发现,悲催的是,竟然忘记怎么用了!噢噢,于是乎,就从网上搜索怎样让nginx和移动端页面联系在一起测试. 可惜的是,我搜索 ...
- win7系统.LNK类型文件打开方式的修复办法
1.首先 win+r 2.打开运行程序 3.输入: regedit 4.找到: 计算机\HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\WINDOWS\currentvers ...