android 内存优化

来源:互联网 发布:淘宝助理怎么复制店铺 编辑:程序博客网 时间:2024/06/02 04:52
以前的笔记,今日分享,希望能帮助有需要的人
1为什么要进行内存优化
app运行内存限制,oom导致app崩溃
app性能:流程性,响应速度和用户体验

android 内存管理方式
1,获取当前手机单进程最大内存
ActivityManager manager = (ActivityManager)getSystemService(Context.ACTIVTIY_SERVIER);
int menClass = manager .getMemoryClass(); 以M为单位
int largememClass = manager.getLargeMemoryClass()
在merfest.xml中配置 application标签下添加largeHeap = "true" :大部分手机设置了也没用

android 系统内存分配与回收方式
1,一个app通常是运行一个虚拟机里面(系统会分配一个进程给虚拟机)
adb shell ; ps:查看进程
2,GC只在Heap剩余空间不够时才触发垃圾回收
3,GC触发是,所有的线程都回被暂停
APP内存限制机制
1,每个app分配的最大内存限制,不同设备不同
2,吃内存大户:图片

切换应用是后台APP清理机制
1,App切换时的LRU Cache(LRU算法进行回收,);
2,清理内存是会调用 onTrimMemory( int level){}

OOM问题优化:内存溢出
1oom出现的绝大部分是跟图片相关的
2注意临时Bitmap对象的及时回收
3避免bitmap的浪费
3typ catch 弄些大内存分配的操作
4加载bitmap :缩放比例,解码格式,局部加载

1M大小的图片解析后的会放大几十倍
屏幕适配
对像素rgb的处理 Bitmap.Config.RGB_563


App内存优化方法
1,数据结构优化
频繁的字符串拼接用StringBuilder;(""+"" 差距横多1000个字符差距 300被)
ArrayMap, SparseArray 替换HashMap;
内存抖动:短时间内创建大量对象,而后又弃之不用,又创建大量对象这时GC回收就会出现
内存抖动 (for()中每个循环都使用新的对象就会出现内存抖动)
在小的class都要耗费0.5KB内存
HashMap中一个entry 需要额外暂用32B
2,对象复用
复用系统自带的资源
ListView/GridView的ConvertView的复用
避免在onDraw方法里面执行对象的创建(onDraw频繁调用会创建多个对象,
创建对象时间长卡顿)

避免内存泄露
内存泄露:由于代码瑕疵,导致这块内存,虽然停止不用了,但依然被其他东西引用着,
使用GC没办法对他回收,如果这种情况发生比较严重,导致频繁使用GC回收,但又回收不了
内存泄露会导致剩余可用Heap越来越少,频繁触发gc
1 内部类的会引用当前类,内部类不停止会造成内存泄露
2ACtivty很容易造成内存泄露
3用Applicaition Context 代替Activity Context
4cursor对象使用后需要立即关闭
5流对象未关闭
6bitmap 对象未使用时未回收

android布局优化
1尽量多使用LinearLayout, 和 RelativeLayout
2在布局层次一样的情况下建议使用linearlayout 代替Relativelayout
3将可复用的组件抽取出来通过include标签使用
4使用ViewStud标签来加载一些不常用的布局
5使用merge标签减少布局的嵌套层次
merge布局的使用
1布局根节点是Framelayout且不需要设置background或padding等属性,可以用merged代替
2布局莫个子布局被其他布局include时,使用marge当作该布局的顶节点,这样在被引入时
顶节点会自动被忽略

android性能分析
常用的工具有eclipse DDMS AS的MOnitor adb 命令
adb shell dumpsys meminfo <package_name>
原创粉丝点击