Android内存优化
一.内存分配
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内存优化相关推荐
- ANDROID内存优化(大汇总——中)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上 ...
- 【Android 内存优化】自定义组件长图组件 ( 长图滚动区域解码 | 手势识别 GestureDetector | 滑动计算类 Scroller | 代码示例 )
文章目录 一.GestureDetector 创建与设置 二.GestureDetector 触摸事件传递 三.触摸滑动操作 四.惯性滑动操作 五.长图滑动组件代码示例 六.运行效果 七.源码及资源下 ...
- 【Android 内存优化】自定义组件长图组件 ( 获取图像宽高 | 计算解码区域 | 设置图像解码属性 复用 像素格式 | 图像绘制 )
文章目录 一.获取图像真实宽高 二.计算解码区域 三.设置解码参数 内存复用 像素格式 四.图像绘制 五.执行效果 六.源码及资源下载 官方文档 API : BitmapRegionDecoder 在 ...
- 【Android 内存优化】Bitmap 硬盘缓存 ( Google 官方 Bitmap 示例 | DiskLruCache 开源库 | 代码示例 )
文章目录 一.Google 官方 Bitmap 相关示例参考 二.磁盘缓存类 DiskLruCache 三.磁盘缓存初始化 四.存储数据到磁盘缓存中 五.从磁盘缓存中读取数据 六. Android 1 ...
- 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 内存复用 | 弱引用 | 引用队列 | 针对不同 Android 版本开发不同的 Bitmap 复用策略 | 工具类代码 )
文章目录 一.Bitmap 复用池 二.弱引用 Bitmap 内存释放 三.从 Bitmap 复用池中获取对应可以被复用的 Bitmap 对象 1.Android 2.3.3(API 级别 10)及以 ...
- 【Android 内存优化】Bitmap 图像尺寸缩小 ( 考虑像素密度、针对从不同像素密度资源中解码对应的 Bitmap 对象 | inDensity | inTargetDensity )
文章目录 一.像素密度对解码图片的影响 二.不考虑像素密度会导致图片缩小尺寸不准确 三.DisplayMetrics 源码阅读.研究手机资源获取规则 四.像素密度参数设置取值 ( inDensity ...
- 【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( 初始化压缩对象 | 打开文件 | 设置压缩参数 | 写入压缩图像数据 | 完成压缩 | 释放资源 )
文章目录 一.使用 libjpeg-turbo 压缩图片流程 二.初始化 JPEG 压缩对象 三.打开文件 四.设置压缩参数 五.开始压缩 六.循环写入压缩数据 七.完成图片压缩及收尾 八.libjp ...
- 【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( JNI 传递 Bitmap | 获取位图信息 | 获取图像数据 | 图像数据过滤 | 释放资源 )
文章目录 一.Bitmap 图像数据处理 二.Java 层 Bitmap 对象转为 JNI 层 bitmap 对象 三.获取 bitmap 中的图像数据 四.过滤 bitmap 中的图像数据 ( 获取 ...
- 【Android 内存优化】libjpeg-turbo 函数库交叉编译 ( libjpeg-turbo 函数库下载 | libjpeg-turbo 编译文档 | 环境准备 | NASM 安装 )
文章目录 一. libjpeg-turbo 函数库下载与解压 二. libjpeg-turbo 编译文档 三. 编译前环境准备 四. 安装 NASM 汇编工具 1. 下载 NASM 汇编工具 2. 拷 ...
- 【Android 内存优化】Android 原生 API 图片压缩原理 ( 哈夫曼编码开关 | 哈夫曼编码原理 | libjpeg-turbo 函数库 )
文章目录 一. 哈夫曼编码开关 二. 哈夫曼编码原理 三. libjpeg-turbo 函数库 四. libjpeg-turbo 函数库下载 [Android 内存优化]图片文件压缩 ( Androi ...
最新文章
- 2017年深度学习必读31篇论文(附下载地址)
- RPC和Restful深入理解
- 数组拼接时中间怎么加入空格_【题解二维数组】1123:图像相似度
- html5情人节贺卡,Web工程师的情人节卡片
- ubuntu 14.04 16.04 安装caffe+cuda8.0+pycafee总结
- 面试前你需要掌握的二叉树、二叉排序树的创建和四种遍历方式
- 《从零开始学Swift》学习笔记(Day 59)——代码排版
- laravel 路由模型绑定
- addr 与 offset 异同
- 面向对象-反射和__getattr__系列
- AirPlay 投影到 Mac 看不到选项如何解决?
- 为系统安装盘集成Server Pack补丁包
- html5效果案例,10个优秀HTML5网站案例赏析
- CENTOS7安装搜狗输入法和PYCHARM光标跟随记录
- 代码覆盖率、功能覆盖率分析
- 【转】图像视觉开源代码
- cql oracle,Cassandra CQL中的Where和Order By子句
- 怎么用计算机名看地址吗,知道计算机名 肿么查ip
- Java log4j详细教程
- [观点]AppStore支持人民币支付对国内开发者的影响