谷歌官方建议笔记——内存

来源:互联网 发布:java中webservice实例 编辑:程序博客网 时间:2024/05/16 10:52

原文

  • 所有进程都是由Zygote fork出来的,所以大部分内存分页都是在进程间共享的
  • Dalvik code、app resources、so文件都是放到mmap里面的,能适应内存页管理
  • 部分IPC是使用目前声明(ashmem 、gralloc)的共享内存的
  • 大块内存被释放后,理论上会被正常回收,但是小块的不一定。大概一页4k(getconf PAGESIZE,无法运行)
  • Process被保存在LRU里面,内存不足时会弹出并回收内存。此时会考虑Process对内存的使用量,如果使用量小,保留的可能性就更大
  • Service应该只在执行工作时再启动,而非一直运行。定时启动应该放到界面中,而非Service
  • IntentService处理完一次HandleIntent就杀死自己
  • 对于UI中的大图片之类的资源,应该在onTrimMemory()的时候进行释放
  • 用getMemoryClass()检查可用内存大小,避免oom
  • 尽量使用 SparseArray,SparseBooleanArray和LongSparseArray
  • Enum相对于一个类,比static final耗内存很多,尽量避免
  • 一个类占用500b内存,一个对象额外占用12-16b内存,HashMap的一个value额外需要32b内存
  • 抽象和继承会影响内存和运行时间
  • 反射可能会造成无用类的加载
  • 一个单独进程会占用大概1.4MB内存,如果app分进程,应该有且仅有一个进程负责更新UI
  • 如果UI进程同时Host了一个Content Provider,使用Content Provider时,UI内存也不会被回收
  • 对于在loop中allocate的对象,可以使用对象池减少GC和allocate。最好在初始化的时候就分配大量对象。对象池中对象的成员变量一定要注意释放
  • 读Bitmap的时候,inScale是直接跳读像素,但是inDensity是对邻近像素进行合并。inScale会快,但只能应用于整数比例缩放,所以可以先使用inScale到大概整数比例,再使用inDensity进行微调视频
  • Enum会显著增大dex大小(compare with int,而非String),所以最好用int替代enum和String
  • View持有其所在Activity的引用,View一旦leak会导致Activity不被回收。注意以下情形:
    • 在回调函数中,不要持有View的引用
    • 不要用Static的View对象
    • 尽量不要在Collection里引用View对象
0 0
原创粉丝点击