android 内存优化

来源:互联网 发布:淘宝真皮包店 编辑:程序博客网 时间:2024/06/04 16:57

 在14年的工作中其实个人感觉收获最大的还是在android 内存中的理解! 我们只有 清楚的了解android 内存的使用情况 才能写出高质量的APP  如何避免OOM   和内存泄露   当遇到内存泄露的时候如何去排查。
        特别是现在大多数的测试人员测试只关注业务流程 ,不管内存使用情况,上线之后出现各种因为内存的问题。所以我们程序员应该很清楚的了解内存 自己管理好app 内存。
  
       内存(RAM)对于任何一个软件开发环境都是种非常珍贵的资源。因为手机的硬件条件相对于PC毕竟是比较落后的。尽管Android系统的虚拟机拥有自动回收垃圾的机制,但这并不代表我们就可以忽视应该在什么时候分配和释放内存。  尽量避免出现内存泄漏的情况(通常都是由于全局成员变量持有对象引用所导致的)并且在适当的时候去释放对象引用。对于大多数的应用程序而言,后面其它的事情就可以都交给垃圾回收器去完成了,如果一个对象的引用不再被其它对象所持有,那么系统就会将这个对象所分配的内存进行回收。
    我们在开发软件的时候应当自始至终都把内存的问题充分考虑进去,这样的话才能开发出更加高性能的软件。
总结了几个合理使用内存的技巧:
    1:

          Service
        如果应用程序当中需使用Service来执行后台任务的话。一定只有当任务需要执行的时候 才运行service  结束完成之后马上关闭要小心Service停止失败导致内存泄漏的情况。当我们启动一个Service时,系统会倾向于将这个Service所依赖的进程进行保留。这样就会导致这个进程变得非常消耗内存。并且,系统可以在LRU cache当中缓存的进程数量也会减少,导致切换应用程序的时候耗费更多性能。严重的话,甚至有可能会导致崩溃,因为系统在内存非常吃紧的时候可能已无法维护所有正在运行的Service所依赖的进程了。
推荐的最佳解决方案就是使用IntentService,这种Service的最大特点就是当后台任务执行结束后会自动停止,从而极大程度上避免了Service内存泄漏的可能性。
2:
         当页面不可见的时候就释放大数据
       
当用户打开了另外一个程序 
       
 我们的程序界面已经不再可见的时候,我们应当将所有和界面相关的资源进行释放。在这种场景下释放资源可以让系统缓存后台进程的能力显著增加,因此也会让用户体验变得更好。
   那么如何知道当前用户已经离开了我们app 呢?
只需要在Activity中重写onTrimMemory()方法,然后在这个方法中监听TRIM_MEMORY_UI_HIDDEN这个级别,一旦触发了之后就说明用户已经离开了我们的程序,那么此时就可以进行资源释放操作了  这个时候我们需要做的是  
                                            只需要在Activity中重写onTrimMemory()方法,然后在这个方法中监听TRIM_MEMORY_UI_HIDDEN这个级别,一旦触发了之后就说明用户已经离开了我们的程序,那么此时就可以进行资源释放操作了
                               在activity里加载的一些布局这种东西不需要释放,可以释放的是在这些布局里用到的像bitmap,或者是大量数据这一类的东西 ,就像一个listview当中,可以考虑把listview里的数据给释放掉,这样就可以节省一些内存,然后回来的时候再重新读取。


3: 
 避免在bitmap 上浪费内存
                在一个很小的imageview 上显示一个超大的图片不会带来任何的视觉体验 正确的做法应该是对图片进行压缩    压缩的比例是根据view 的大小来定 

4:使用优化过的数据集合 
          
Android API当中提供了一些优化过后的数据集合工具类,如SparseArray,SparseBooleanArray,以及LongSparseArray等,使用这些API可以让我们的程序更加高效。传统Java API中提供的HashMap工具类会相对比较低效,因为它需要为每一个键值对都提供一个对象入口,而SparseArray就避免掉了基本数据类型转换成对象数据类型的时间。
5:使用多个进程 
 

            在工作中 我发现很多谷歌提供的SDK 都是存在内存泄露的情况的  但是又不得不用  比如 webview。。。 使用webview 最好的方式就是 开启一个新进程 来打开webview  微信就是这样的做法


0 0