性能优化的终极目标-内存简析
性能优化的终极目标-内存简析
通常来说为了避免磁盘I/O问题,都会用内存缓存起来,结果什么都用内存缓存起来,App的常驻内存就会很大,若内存处理不当机会变成内存问题,甚至最后成为OOM的导火索。
Out of Memory,OOM是常见的内存溢出问题。通常会在decode图片的时候触发,但不一定是decode图片的问题,因为也许它只是压垮骆驼的稍微大一点的稻草。在虚拟机的Heap内存使用超过堆内存最大值(Max Memory Heap)的时候,就会出现OOM问题了。
Android没有虚拟内存,安卓系统对于每个应用都有内存使用的限制,所以系统为每个应用分配一小部分内存。假如是游戏类型软件这种消耗内存的特殊应用,Android在mainifest里面可以设置LargerHeap为true。
heapsize是在manifest中设置了largeHeap=true之后,可以使用最大内存值。设置largeHeap的确可以增加内存的申请量。但不是系统有多少内存就可以申请多少,而是由dalvik.vm.heapsize限制。在内存稀缺的背景下,为了保证前台App和系统能够稳定运行,在手机剩余内存低于内存警戒线时,会触发Low Memory Killer机制,App占用的内存越多,被Low memory Killer 处理掉的机会越大。
内存问题主要包括常驻问题(如图片缓存)、内存泄露问题(如activity泄露)、GC问题(关键是GC For Alloc),后果就是导致App Crash、闪退、后台被杀、卡顿,而且这是各种资源类性能问题积压的最后一环。
- GC(Garbage Collection)
最简单的的理解就是没有被GC ROOT间接或直接引用的对象的内存会被回收。当并发执行GC的时候ART比Dalvik少了一个stop-the-world的阶段,因此Dalvik比ART(Android Runtime 是Android4.4发布的用来替换Dalvik虚拟机)更容易产生Jank(卡顿)。然而在内存不足以分配给新的对象时时触发GC for Alloc,无法并发执行GC导致stop-the-world的时间会变得更长。所以尽量避免CG For Alloc,除了减少内存的申请回收外,更重要的是减少常驻内存和避免内存泄露。 - 内存泄露-主要指activity泄露
因为activity对象会间接或者直接引用View、Bitmap等,所以一旦无法释放,会占用大量内存。泄露基本上都是GC ROOT 对Activity的直接引用、this$0 间接引用、mContext间接引用。
引用的方式/GC ROOT | Class-(静态变量) | 活着的线程 |
---|---|---|
mContext间接引用 | 静态View,InputMethodManager | SensorManager、WiFiManager(其他Service进程都可以) |
this$0 间接引用 | 内类引用 | 匿名类/Timer/TimerTask/Handler |
直接引用 | 静态Activity | – |
- 图片缓存
建议使用一个进程所能申请的最大内存的四分之一作为图片缓存(Android进程都有最大内存上限,这依据手机ROM而定,手机出厂就被固定,一般不会更改)。图片缓存达到容积上限时,内部使用LRU算法做淘汰,淘汰那些“有老有少被使用到”的图片,这就是内存图片缓存的大体设计思维。对于多图片类App,内存使用够呛,现有两种硬盘缓存方案。- DiskLruCache,简单理解就是LruCache的硬盘版本,容错性强,但是对比BlobCache,I/O性能一般。
- BlobCache,这个方案源自Android原生的相册,利用索引(Index)文件、活动(Active)文件、非活动(Unactive)文件,通过索引(偏移)来读取活动文件的图片缓存。清楚旧图片的方法简单粗暴,直接seek到文件头部,覆盖写入就可以。这一切都是为了用最小的磁盘I/O代价完成磁盘缓存。
- 另外官方也建议把内存淘汰的图片,降低压缩比存储到本地,以备后用,最大限度地降低以后复用时的解码开销。
检测Android关于内存的工具有不少,灵活的选择工具就显得特别重要,下一篇就重点介绍相关检测工具。
性能优化的终极目标-内存简析相关推荐
- kvm性能优化方案---cpu/内存/磁盘/网络
kvm性能优化方案 kvm性能优化,主要集中在cpu.内存.磁盘.网络,4个方面,当然对于这里面的优化,也是要分场景的,不同的场景其优化方向也是不同的,下面具体聊聊这4个方面的优化细节. cpu 在介 ...
- Android性能优化系列之内存优化
在Java中,内存的分配是由程序完成的,而内存的释放是由垃圾收集器(Garbage Collection,GC)完成的,程序员不需要通过调用函数来释放内存,但也随之带来了内存泄漏的可能,上篇博客,我介 ...
- 性能优化CPU、内存、磁盘I/O、网络性能相关命令
系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书本上 ...
- iOS25个性能优化,和内存优化
1. 用ARC管理内存 ARC(Automatic ReferenceCounting, 自动引用计数)和iOS5一起发布,它避免了最常见的也就是经常是由于我们忘记释放内存所造成的内存泄露.它自动为你 ...
- iOS 性能优化 - Allocations分析内存分配
Allocations Allocations用来分析静态内存分配. Demo项目 Demo App Demo是一个简单的图片应用:首页只有一个简单的入口:次级页面会读取本地图片,加滤镜,然后按照瀑布 ...
- 1g内存服务器Apache怎么优化,Apache性能优化-解决吃内存的问题 | kTWO-个人博客
虽然现在已经00:22了,但是还是抑制不住内心的激动,因为解决了好几天以来一直困惑我的问题--服务器httpd服务一直在吃内存,只要有人访问,服务器的内存就会小一点,慢慢的就会被吃掉所有内存,经过几天 ...
- Android 性能优化 - 彻底解决内存抖动
起源 内存抖动是由于短时间内有大量对象进出新生区导致的,它伴随着频繁的GC. gc会大量占用ui线程和cpu资源,会导致app整体卡顿 android profile 效果图如下图 Memory 中 ...
- linux cached 进程,关于Linux cached内存简析
Background : 系统共16g内存,给Elasticsearch只指定了2g内存,上面没装其他的东西,结果查看系统内存使用率一直是85%以上(13g),用free查看,有相当一部分memory ...
- Android 性能优化 - 彻底解决内存泄漏
起源 有趣的灵魂千奇百怪,内存泄漏的也是各式各样 我在15年写过一遍 文章 < android中常见的内存泄漏和解决办法>http://blog.csdn.net/wanghao20090 ...
- Android 性能优化 之谈谈Java内存区域
最近一年副业主要在学习投资和技能学习,把以前学习内存分析的一些笔记总结发出来,写了很多笔记总结都没有写完就又忙着了,最近再次总结复习学习一遍,还有提醒各位同学一定要学会投资.. 了解Android 内 ...
最新文章
- python3 strip lstrip rstrip 删除字符串首尾指定字符
- LFS 8.3 中文翻译版本发布!
- Android音频开发(4):如何存储和解析wav文件
- javascript --- 使用语法糖class定义函数
- oracle ola_Ola HallengrenSQL Server维护解决方案–安装和SQL Server备份解决方案
- Ubuntu服务启动脚本
- android之统一字体大小
- 注塑模设计必懂的知识
- Tony Bai带你入门Go语言
- 【onnx】——since it‘s not constant, please try to make things (e.g., kernel size) static if possible
- 2021年江苏镇江公务员考试报考指南
- 尊重孩子 梅兰芳“宠溺有道”
- [深入研究4G/5G/6G专题-22]: 5G NR开机流程3.4 - MAC层对SIB1的调度 - SIB1消息的格式与内容
- LUA调用C(一)-----CAPI
- 华硕h81m一k跳线图_主板跳线接法
- jquery开关灯案例_jQuery实现开关灯效果
- php 参数与数字比较,PHP8中字符串与数字的比较更智能
- 大疆 android 简书,实测大疆智图与CC(Smart3D)三维建模、正射拼图对比
- vue生命周期函数面试题
- 电脑html文件删除,电脑plugin可以删除吗
热门文章
- 如果本地连接受限或无连接的解决方法
- Redis介绍 AND SpringBoot集成Redis
- 计算机网络掉线,电脑网络经常掉线的解决方法
- Bibtex4Word无法使用IEEEtran等参考文献格式的解决方法
- 基于Python实现的远程控制主机设计
- python音乐编程_可以编程写音乐的python库musicpy教程(第一期) musicpy的数据结构...
- linux系统下复制粘贴不了怎么办,电脑复制粘贴不了怎么解决?三种解决办法 了解一下...
- Java模拟新浪微博登陆抓取数据
- PXE安装windows系统,pxe-e55:ProxyDhcp service did not reply to request on port 4011
- TDR 及其测试原理