Android之内存管理
为什么要管理内存
作为一个android 开发人员,我们应该都知道android虽然是开源的,但是android 系统底层会给每个app 分配一个内存阀值,一旦app 在运行过程中,所占有的内存超过这个阀值,那么应用就会报oom(Out Of Memory 内存溢出) 异常!只是这个阀值会因为手机的不同阀值也不一样(每个系统厂商对底层进行了修改)!
既然内存这么珍贵,那么我们应该怎么更有效的去使用和管理内存呢?
内存管理
1、用IntentService代替Service
如果你要在一个service里面进行后台操作,那么当你的service 做完了这件事之后一定要管理你的service!
因为当service开启的时候,系统是希望这个service一直run 下去的,那么在service对后台数据操作完而不去关闭的话会占有不必要去开销的内存(ram)。因为service开启占有了内存,那么这样必然导致系统所持有的lru cache 内存的减少!lru cache的减少这样也会导致app 切换效率的降低,如果内存比较紧张的情况下,那么还有可能导致系统崩溃!
那么怎么管好自己的service 呢? 其实android 已经为你提供了一个比较好的service类 IntentService! IntentService这个类可以在处理完intent 传过来的数据后进行自我关闭!
2、当内存紧张的时候,释放你的内存
你可以在你的application 重写回调方法onTrimMemory(int num) 来监听你的应用的内存情况!当你监听到应用app 内存紧张的情况下你可以释放所持有的内存资源。比如说bitmap 的强引用,缓存等对象! 下面是onTrimMemory(int num) 中返回int 的含义
TRIM_MEMORY_RUNNING_MODERATE :你的app 正在运行,系统也没考虑去杀死他。但是系统内存已经不足(low on memory),所以系统正在积极的清理lru 里面的感觉不必要的对象
TRIM_MEMORY_RUNNING_LOW :你的app 正在运行,系统也没考虑去杀死他。但是系统内存已经更不足(much lower on memory ),所以这个时候你就该行动起来释放你所持有必要的内存
TRIM_MEMORY_RUNNING_CRITICAL :你的app 还是运行的,但是这个时候你如果在不有所行动,恭喜你你的app 要挂了。哈哈!
3、不要把太多内存放在bitmap 上面
众所周知,bitmap加载是很消耗内存的,所以在这个时候建议你最好用第三方来加载图片!(其实底层就是 软引用和lru 原理是实现的) 如果你想知道怎么去管理bitmap那么请点击管理bitmap!
4、用SparseArray 相关类
java 中常用到map相关类进行数据存储,android 也封装了一系列其使用方法和map 相似但是性能更高的类SparseArray!SparseArray性能更高的原因是其避免了装箱key 和value 的这个过程!
5、谨慎使用抽象
通常来说,程序员使用抽象(abstractions ) 让人感觉这样设计能好!虽然抽象的使用能让代码更加灵活和更好维护,但是抽象的使用更加耗费内存,所以呢,如果你使用抽象的时候没有什么显著的提升的时候最好少用抽象!比如说,你一个200就解决的代码,就没有必要去做什么mvp分层!因为即使这样做了,也是耗时又费力!提升又不大!
6、使用protobufs
Protobuf(Google Protocol Buffers)是google开发的的一套用于数据存储,网络通信时用于协议编解码的工具库.它和XML和Json数据差不多,把数据已某种形式保存起来.Protobuf相对与XML和Json的不同之处,它是一种二进制的数据格式,具有更高的传输,打包和解包效率!
至于android 中是否用到呢? 我看过一篇博客,一兄弟在东南亚写客户端,因为那里的网络没国内好,所以一般json 数据传输会有问题,所以其使用了protobufs 代替了json 解决了这问题,因为protobufs 传输效率高于json
如果你要学习怎么使用protobufs ,这里有一篇谷歌文档你可以尝试看看谷歌protobuf
7、尽量少使用依赖注解框架
依赖注解框架能简化代码,避免程序员做很多繁琐的工作。但是谷歌缺提醒你少用或者慎用依赖注解,为什么呢?因为依赖注解框架在执行的时候会扫描你的代码和你的注解来初始化,然后把这些放在内存(ram)中,其实也许在扫描你代码的时候产生一些你根本不需要的东西,依赖注解框架也会把这些毫无作用的东西加在内存里面,这样的话其实毫无疑问的增加你app的内存!所以谷歌不推荐使用依赖注解
8、使用ProGuard剔除无效代码
ProGuard通过删除未使用的代码并重新命名语义模糊的类、字段和方法,来缩小、优化和混淆代码。使用PROGART可以使代码更加紧凑,需要映射更少的内存
怎么用ProGuard ? 快来看看谷歌文档!proguard项目使用
9、使用zipalign压缩你的apk
其实上架过谷歌应用市场的人应该知道,我们要把app 上架谷歌,其实最后一步就是zipalign 压缩apk。细心的人会发现zipalign 压缩的apk 比我们打包好的apk还小了不少。其实zipalign 压缩apk,就是在最后一步把相应的资源进行对齐,如果不这样做可能导致应用程序需要更多的RAM,因为像资源之类的东西不再能从APK中映射出来!
10、使用多进程
因为android 里面一个app的内存上限是一定的,那么我们要让我们自己的app 有比别人更大的内存的话,那么我们其实可以开启多进程,这样的话我们的内存就比一般的应用多了不少!
那我们怎么开启多线程呢?其实就是在组件里面属性android:process
设置成不同的名字就好了,如果设置成一样的名字那么就是一个进程!android默认是在一个进程,所以在组件不设置这个属性的时候大家都是在一个进程的!使用方法如下
<service android:name=".PlaybackService"
android:process=":background" />
android 内存管理差不多就讲到这里,喜欢的小伙伴点一波关注,有时间写一套代码大家相互学习一下!
上一篇: spring连接各种数据库
下一篇: 操作系统内存管理--内存使用分布
推荐阅读
-
abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理四 (二十二)
-
KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法
-
详解iOS应用开发中的ARC内存管理方式
-
Android 游戏开发之Canvas画布的介绍及方法
-
Android基础之使用Fragment控制切换多个页面
-
Android基础之使用Fragment适应不同屏幕和分辨率(分享)
-
Android基础之Fragment与Activity交互详解
-
Android控件之ScrollView用法实例分析
-
Android控件之ImageView用法实例分析
-
Android控件之ScrollView用法实例分析