盒子
盒子
Posts List
  1. 一. 防止 OOM
    1. Bitmap 加载 善用缓存
    2. 及时回收
    3. 申请大内存
    4. Handler 泄露
    5. 背景图
    6. webView 泄露
    7. Cusor 释放 ,IO 释放 ,静态变量
    8. 需求层面协商
  2. 二. android内存分配
  3. 三. 内存泄露调试
  4. 四. 常见错误
    1. gradle 编译错误 1073741819
  5. 五. 图标尺寸与目录对应关系

android点滴

一. 防止 OOM

OOM => allocated + 新分配的内存 >= getMemoryClass()

Bitmap 加载 善用缓存

内存缓存 WeakHashMap

文件缓存 LRUCache

考虑使用Glide

及时回收

强引用:如果出现内存不足会抛出OOM

软引用:内存不足时,GC会回收 SoftRefrence

弱引用:每次GC检测到都会回收 WeakRefrence

申请大内存

largeHeap自Android 4.0开始支持,在manifest.xml中申明largeHeap会使得可使用的dalvik heap大小增加(大约2倍)

Handler 泄露

普通非static handler 运行在UI线程,如果还有未处理的MessageQueue消息,则当activity关闭后引用不会被回收
可以在 activity的onDestroy中去删除handler的剩余消息处理

背景图

纯色背景图尽量使用color,不要用图。
可拉伸图用九宫格
适当考虑降低图片的质量,将图片在内存中的存储形式由ARGB_8888 改为 ARGB_4444

BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_4444;
Bitmap btimapObject = BitmapFactory.decodeFile(myImage.getAbsolutePath(), options);

webView 泄露

使用applicationContext,在退出app的时候,使用System.exit(0)

Cusor 释放 ,IO 释放 ,静态变量

需求层面协商

二. android内存分配

andorid 内存分配由linux系统决定,每一个app都运行在Dalvik的独立进程中,名字就是app的包名

android 为每一个dalvik进程设置了硬性的heap size,可以通过getMemoryClass()来获得。

app占用内存主要由两部分组成
native heap : c/c++分配使用
dalvik heap : java分配使用

三. 内存泄露调试

MAT:分析两次dump文件

leakCanary

四. 常见错误

gradle 编译错误 1073741819

描述:

execution failed for task XXXXX finished with non-zero exit value -1073741819

解决:

升级gradle buildToolsVersion 为 21.1.2

五. 图标尺寸与目录对应关系

支持一下
扫一扫,支持牛头码农