一.内存分配

1.内存结构

创建进程分配内存块
内存块中有堆,栈,静态存储区
静态存储区,存放静态数据,全局static数据和常量;
堆,存放对象;
栈,当进程中创建了线程,分给线程一个栈,用于存放局部变量;
函数开始执行时,局部变量的存储单元在栈上创建,当函数执行结束,释放这些存储单元;

堆是不连续的,堆的空间比较大,
栈是连续的内存区域,空间比较小

问题:
1)如何给成员变量分配内存?
成员变量全部存储于堆中(包括基本数据类型,对象引用和引用指向的对象实体),因为它们属于类;
2)int i= 1; 1存放在哪里?

2.内存分配的流程

1)申请内存;
2)申请成功,结束;申请失败,GC,再次申请;
3)申请成功,结束;申请失败,增加堆的大小,再次申请;
4)申请成功,结束;申请失败,GC,再次申请;
5)申请成功,结束;申请失败,OOM;

    void* dvmMalloc(size_t size, int flags)
{  void *ptr;  dvmLockHeap();  /* Try as hard as possible to allocate some memory. */  ptr = tryMalloc(size);  if (ptr != NULL) {  /* We've got the memory. */  if (gDvm.allocProf.enabled) {  Thread* self = dvmThreadSelf();  gDvm.allocProf.allocCount++;  gDvm.allocProf.allocSize += size;  if (self != NULL) {  self->allocProf.allocCount++;  self->allocProf.allocSize += size;  }  }  } else {  /* The allocation failed. */  if (gDvm.allocProf.enabled) {  Thread* self = dvmThreadSelf();  gDvm.allocProf.failedAllocCount++;  gDvm.allocProf.failedAllocSize += size;  if (self != NULL) {  self->allocProf.failedAllocCount++;  self->allocProf.failedAllocSize += size;  }  }  }  dvmUnlockHeap();  if (ptr != NULL) {  /* * If caller hasn't asked us not to track it, add it to the * internal tracking list. */  if ((flags & ALLOC_DONT_TRACK) == 0) {  dvmAddTrackedAlloc((Object*)ptr, NULL);  }  } else {  /* * The allocation failed; throw an OutOfMemoryError. */  throwOOME();  }  return ptr;
}
static void *tryMalloc(size_t size)
{  void *ptr;  ......  ptr = dvmHeapSourceAlloc(size);  if (ptr != NULL) {  return ptr;  }  if (gDvm.gcHeap->gcRunning) {  ......  dvmWaitForConcurrentGcToComplete();  } else {  ......  gcForMalloc(false);  }  ptr = dvmHeapSourceAlloc(size);  if (ptr != NULL) {  return ptr;  }  ptr = dvmHeapSourceAllocAndGrow(size);  if (ptr != NULL) {  ......  return ptr;  }  gcForMalloc(true);  ptr = dvmHeapSourceAllocAndGrow(size);  if (ptr != NULL) {  return ptr;  }  ......  return NULL;
}

3.Android的内存分配

1)Dalvik虚拟机的内存分配
2)ART的内存分配

二.内存回收-GC

1.Java的GC

GC针对的是堆内存;

GC的步骤:

1)寻找应该回收的对象;
2)回收对象;

GC算法:

1) 引用计数
2)标记-清除
3)标记-清除-压缩
4)复制
5)增量
6)分代

GC-Roots:程序的主要运行对象,如静态对象/寄存器/栈上指向的内存对象等;
GC-Root可达:从GC-Root开始,通过所持有引用的可以获取到的对象是GC-Root可达的,
剩下的对象是GC-Root不可达的,是GC回收的对象;

2.Android的GC

三.内存问题

内存使用不合理引发的问题:

1.OOM

2.GC过多,影响程序的运行

内存使用不合理

1.内存泄漏

1)GC-Root持有对象的引用,static,final;
2)线程持有对象的引用,造成对象的生命周期同线程的生命周期相同;
3)内部类持有外部类的引用,造成外部类的对象的生命周期与内部类的对象生命周期相同;

2.内存占用较大的对象

1)Bitmap

四.内存检测工具

1.Heap Viewer
2.Allocation

参考:https://www.jianshu.com/p/310...

Android内存优化相关推荐

  1. ANDROID内存优化(大汇总——中)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上 ...

  2. 【Android 内存优化】自定义组件长图组件 ( 长图滚动区域解码 | 手势识别 GestureDetector | 滑动计算类 Scroller | 代码示例 )

    文章目录 一.GestureDetector 创建与设置 二.GestureDetector 触摸事件传递 三.触摸滑动操作 四.惯性滑动操作 五.长图滑动组件代码示例 六.运行效果 七.源码及资源下 ...

  3. 【Android 内存优化】自定义组件长图组件 ( 获取图像宽高 | 计算解码区域 | 设置图像解码属性 复用 像素格式 | 图像绘制 )

    文章目录 一.获取图像真实宽高 二.计算解码区域 三.设置解码参数 内存复用 像素格式 四.图像绘制 五.执行效果 六.源码及资源下载 官方文档 API : BitmapRegionDecoder 在 ...

  4. 【Android 内存优化】Bitmap 硬盘缓存 ( Google 官方 Bitmap 示例 | DiskLruCache 开源库 | 代码示例 )

    文章目录 一.Google 官方 Bitmap 相关示例参考 二.磁盘缓存类 DiskLruCache 三.磁盘缓存初始化 四.存储数据到磁盘缓存中 五.从磁盘缓存中读取数据 六. Android 1 ...

  5. 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 内存复用 | 弱引用 | 引用队列 | 针对不同 Android 版本开发不同的 Bitmap 复用策略 | 工具类代码 )

    文章目录 一.Bitmap 复用池 二.弱引用 Bitmap 内存释放 三.从 Bitmap 复用池中获取对应可以被复用的 Bitmap 对象 1.Android 2.3.3(API 级别 10)及以 ...

  6. 【Android 内存优化】Bitmap 图像尺寸缩小 ( 考虑像素密度、针对从不同像素密度资源中解码对应的 Bitmap 对象 | inDensity | inTargetDensity )

    文章目录 一.像素密度对解码图片的影响 二.不考虑像素密度会导致图片缩小尺寸不准确 三.DisplayMetrics 源码阅读.研究手机资源获取规则 四.像素密度参数设置取值 ( inDensity ...

  7. 【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( 初始化压缩对象 | 打开文件 | 设置压缩参数 | 写入压缩图像数据 | 完成压缩 | 释放资源 )

    文章目录 一.使用 libjpeg-turbo 压缩图片流程 二.初始化 JPEG 压缩对象 三.打开文件 四.设置压缩参数 五.开始压缩 六.循环写入压缩数据 七.完成图片压缩及收尾 八.libjp ...

  8. 【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( JNI 传递 Bitmap | 获取位图信息 | 获取图像数据 | 图像数据过滤 | 释放资源 )

    文章目录 一.Bitmap 图像数据处理 二.Java 层 Bitmap 对象转为 JNI 层 bitmap 对象 三.获取 bitmap 中的图像数据 四.过滤 bitmap 中的图像数据 ( 获取 ...

  9. 【Android 内存优化】libjpeg-turbo 函数库交叉编译 ( libjpeg-turbo 函数库下载 | libjpeg-turbo 编译文档 | 环境准备 | NASM 安装 )

    文章目录 一. libjpeg-turbo 函数库下载与解压 二. libjpeg-turbo 编译文档 三. 编译前环境准备 四. 安装 NASM 汇编工具 1. 下载 NASM 汇编工具 2. 拷 ...

  10. 【Android 内存优化】Android 原生 API 图片压缩原理 ( 哈夫曼编码开关 | 哈夫曼编码原理 | libjpeg-turbo 函数库 )

    文章目录 一. 哈夫曼编码开关 二. 哈夫曼编码原理 三. libjpeg-turbo 函数库 四. libjpeg-turbo 函数库下载 [Android 内存优化]图片文件压缩 ( Androi ...

最新文章

  1. 2017年深度学习必读31篇论文(附下载地址)
  2. RPC和Restful深入理解
  3. 数组拼接时中间怎么加入空格_【题解二维数组】1123:图像相似度
  4. html5情人节贺卡,Web工程师的情人节卡片
  5. ubuntu 14.04 16.04 安装caffe+cuda8.0+pycafee总结
  6. 面试前你需要掌握的二叉树、二叉排序树的创建和四种遍历方式
  7. 《从零开始学Swift》学习笔记(Day 59)——代码排版
  8. laravel 路由模型绑定
  9. addr 与 offset 异同
  10. 面向对象-反射和__getattr__系列
  11. AirPlay 投影到 Mac 看不到选项如何解决?
  12. 为系统安装盘集成Server Pack补丁包
  13. html5效果案例,10个优秀HTML5网站案例赏析
  14. CENTOS7安装搜狗输入法和PYCHARM光标跟随记录
  15. 代码覆盖率、功能覆盖率分析
  16. 【转】图像视觉开源代码
  17. cql oracle,Cassandra CQL中的Where和Order By子句
  18. 怎么用计算机名看地址吗,知道计算机名 肿么查ip
  19. Java log4j详细教程
  20. [观点]AppStore支持人民币支付对国内开发者的影响

热门文章

  1. Jquery多选框互相内容交换
  2. 遇到问题的时候,要学会问问题
  3. 简单的实现HTTP密码验证登陆
  4. 服务器使用nginx做代理,通过HttpServletRequest获取请求用户真实IP地址
  5. 【leetcode❤python】Intersection of Two Arrays
  6. iOS开发学习之NSFetchedResultsController
  7. solr suggest+autocomplete实现自动提示
  8. 用户调用机房收费下机中用到的策略与职责链解析
  9. 第七章 课后习题P206
  10. 使用JSON实现分页