android内容优化之道
1.共享内存
android尝试跨进程共享ram页,分配和回收内存
每个进程都被限制到一个单一的虚拟内存范围内
Dalvik堆不会压缩堆的逻辑空间,这意味着Android不会进行碎片整理来腾出空间,只有空闲空间在堆的尾部时(at the end of the heap),Android才可以压缩逻辑堆的空间。但这并不意味着堆使用的物理内存不能被压缩
当App内存达到了空间最大值,并尝试分配更多的内存,就会发生oom
用户切换APP时,Android会使用LRU缓存来保存那些被切换的APP而不是使用交换空间来实现
在开发的所有阶段你都应该考虑RAM的限制,即使是在设计阶段,你还没有开始编码工作。你应该使用以下技术来管理你的APP内存。
app内存优化 :
减少service的使用,因为service不使用的时候,还在后台运行,会占用内存,当service没有占用的时候一定要结束service,
当用户界面隐藏时,释放内存
当用户退出UI界面时,使用onTrimMemory()回调函数,你应该使用这个方法去监听TRIM_MEMORY_UI_HIDDEN这个值,他表示UI界面当前正在隐藏,使用被UI界面占用的内存
app所有的界面都隐藏时,才会在OnTrimMemory()回调函数中检测到TRIM_MEMORY_UI_HIDDEN这个值,与onStop不同,onStop是界面隐藏时调用
内存紧张时,释放内存
检查你应该使用多少内存
不同的安卓数量有着不同的内存,使用getMemoryClass获得可以使用内存大额大小
使用bitmaps避免内存浪费,当你加载一张bitmap时,如果他分辨率过高
使用最佳的数据容器:如sparseArray,sparseBooleanArray,sparseLongArray,避免对键值对的装箱,普通的hashmap会花费更多的内存,因为他需要为每一个映射分配一个实体
注意内存开销
尽量避免使用枚举类型,枚举类型占用空间是普通类型的两倍。
小心代码抽象化
抽象化需要更多的代码来执行他,需要更多的开销
为序列化数据使用nano protobufs
数据缓冲区是一种有谷歌序列化而设计的泛语言
不要依赖注入框架
使用proGuard来去除不必要的代码
在最终生成的apk文件使用zipalign,通过androidMainFest.xml文件中声明的android:process来为应用分身,是你的service运行在一个单独的进程中
网友评论