OOM-关于Android内存溢出的一些解决思路的整理_android运行内存超过allocation崩溃-程序员宅基地

技术标签: 内存溢出  AndroidMaker  OOM  整理  思路  Android  

原因:系统为每一个应用程序分配了不同的内存上限,如果超过这个上限被视为内存泄露,从而被kill掉。

比如:

1.加载对象过大
2.相应资源过多,来不及加载。


解决办法们

oom这个真的不好权衡,下面这些注意事项好多是相互矛盾的,根据业务,各取所需吧。
而且一味的追求小内存开销,也不好。
毕竟,硬件本身的性能越来越强大,你不用,它也会老化。

一、图片

1.内存中加载图片直接在内存中做处理(如边界压缩)
2.减少Bitmap对象的内存占用

1.加载之前先计算出合适的缩放比例
2.选择合适的解码格式:ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,内存在很大差异。
(比如:带 alpha通道的图片,每个像素的要多消耗2字节的内存

3.临时Bitmap的及时回收

二、对象

1.动态回收内存
2.内存引用上做一些处理。(eg:软引用)
3.对象的复用

1.复用系统自带的资源:字符串、图片、动画、样式、颜色、简单布局
2.列表(eg:ListView)中对视图的复用
3.实例对象的复用:inBitmap属性可以告知Bitmap解码器使用已经存在的内存区域而不是重新申请一块内存区域
4.避免对象的频繁创建(eg:在onDraw()、循环中创建对象等)
5.StringBuilder替代""+"“的拼接
6.用Integer.toString代替String.valueOf(int)和 int+”"; (因为String会做很多业务上不必要的判断。
(其实这应该算是性能问题了哈:)

4.当心对象的复用

比如static对象:因为这玩意和应用进程一样长命

5.注意单例模式中的不合理持有

虽然单例模式有效的避免了对象的多出创建,但缺点也在这里:
单例的生命周期和应用保持一致(static),使用不合理很容易出现持有对象的泄漏。(不能正常回收)

6.注意监听器的及时注销
7.避免使用枚举Enum(好多时候用枚举就图个好看)
8.使用更加轻量的数据结构

考虑使用ArrayMap/SpareseArray而不是传统的HashMap等数据结构。因为HashMap需要一个额外的实例对象来记录Mapping的操作。

9.如果没有必要,就不要用抽象类

因为抽象类这些一般都没有正经的事做。


三、页面上

1.优化布局层次,减少内存开销
2.Activity方面的问题

1.Activity对静态变量的持有问题
2.页面回收时记得清空Handler消息队列
3.Activity Context被其他实例持有

3.webview的泄露

Android不同版本对webview产生有很大差异。
常用的办法:为webview新开一个进程,通过AIDL与主进程通信。(在需要的时候对webView进行销毁


四、系统

1.自定义堆内存大小
2.优化Delivk虚拟机的堆内存分配
3.申请大内存large heap

谨慎使用!这可能会影响整个系统的用户体验。

4.Services用完及时停止。

因为这货的优先级一般较高,系统一般不会吧Service所占用的RAM空间腾出来让给其他组件

5.谨慎使用多进程

多进程可以把应用中的部分组件运行在单独的进程当中,系统一般会给多进程分配更多的内存,
但是这会显著增加代码的逻辑复杂度,而且容易成为业界的毒瘤。(这个,,嘛,,

6.注意第三方libraries的应用

一般你是不会用到一个libraries的所有功能的,这就存在用内存去养那些你压根就不会用的对象

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zull_kos_mos/article/details/83314515

智能推荐

结构体变量的初始化-先定义后初始化_先定义在初始化-程序员宅基地

文章浏览阅读3.4k次。1 直接初始化了解结构体变量的引用之后,下面演示一下如何定义后再初始化#include<stdio.h>#include<string.h>struct AGE{ int year; int month; int day;}struct STUDENT{ char name[20]; int num; struct AGE birthday; ..._先定义在初始化

TakePhoto框架源码流程解析(一)_takephoto详解-程序员宅基地

文章浏览阅读96次。https://blog.csdn.net/qq_18242391/article/details/79113997https://blog.csdn.net/qq_18242391/article/details/79113997https://blog.csdn.net/fayangzhou/article/details/88029788Androi..._takephoto详解

cube配置HAL库GPIO中断_hal_gpio_exio_call-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏4次。STM32用cube配置GPIO外部中断记录void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin == PIN_KEY_Pin) //判断是否为按键引脚 { if(HAL_GPIO_ReadPin(PIN_KEY_GPIO_Port, PIN_KEY_Pin) == RESET) //判断按键引脚是否为底 { ..._hal_gpio_exio_call

matlab 画柱状图和误差棒,小白1分钟绘图:带误差棒的柱状图-程序员宅基地

文章浏览阅读3.2k次。目标图片效果想要实现的图片效果其实上图说白了就是均值加减标准差,上面的线条是用来标示组间比较的。制图清单1.工具: R+Rstudio2.数据准备:需要如下样式的数据。第一列是分组,第二列是均值,第三列是标准差。数据格式3.设置R软件工作目录:为了方便找到结果的图,可以把工作目录设置为桌面。操作如下:工作目录设置4.跑代码:打开Rstudio导入数据运行代码就行了~将数据文件放在桌面,导入数据,注..._matlab对平均值的误差棒

Lingo_ 运算符及其优先级和函数总览_lingo中的运算符-程序员宅基地

文章浏览阅读8.2k次,点赞3次,收藏42次。1.运算符及其优先级现在归纳一下 LING0 中的三类运算 符:算术运算符、逻辑运算符和关系运算符。算术运算符有 5 种:+(加法),—(减法或负号),*(乘法),/(除法),^(求幂)。逻辑运算符有 9 种:#AND#(与),#OR#(或),#NOT#(非),#EQ#(等于),#NE# (不等于),#GT#(大于),#GE#(大于等于),#LT#(小于),#LE#(小于等于)。逻 ..._lingo中的运算符

分析问题的方法_edas 材質分析-程序员宅基地

文章浏览阅读322次。要解决一个问题,首先要弄清楚问题是什么?也就是分析问题。怎样分析问题呢?分析问题就是要找到问题的一些规律,那就得先从简单入手,有特殊的情况,再到复杂的情况。 注意以后要多思考,多分析问题。查看大公司的招聘试题,同时关注其他方面的信息。_edas 材質分析

随便推点

js 获取url参数及中文解析_js url 中文解析-程序员宅基地

文章浏览阅读3k次。jsfunction parseURL(url){ if(!url) return; url = decodeURI(url); var url = url.split("?")[1]; var para = url.split("&amp;"); var len = para.length; var res = {}; var arr = []; for(var i=0;i&l..._js url 中文解析

ubuntu python3 mysql_Ansible+Ubuntu 18.04+MySQL=“需要PyMySQL(Python 2.7和Python 3.X)或MySQLpython(Python...-程序员宅基地

文章浏览阅读199次。我在ubuntu18.04上使用ansible2.8在多个playbooks上看到了上述消息。为了简单起见,我在单节点Drupal服务器上使用了这个基本的playbook来复制它。https://github.com/geerlingguy/ansible-for-devops/tree/master/drupal;这个剧本在早期版本的ubuntu上运行得很好,但是在18.04版本上就不行了,我知..._ubuntu缺少 the pymysql (python 2.7 and python 3.x) or

亲测有效,解决Can 't connect to local MySQL server through socket '/tmp/mysql.sock '(2) ";_lnmp can't connect to local mysql server through s-程序员宅基地

文章浏览阅读377次。版权声明:本文为博主原创文章,..._lnmp can't connect to local mysql server through socket '/tmp/mysql.sock

QT界面 添加图片 的2种方式_qt插入图片-程序员宅基地

文章浏览阅读3.3w次,点赞11次,收藏54次。【方式一】:1、接下来我们点击界面文件:【Forms下的mianwindow.ui】,拖动一个PushButton进去测试,然后右击这个按钮,选择改变样式表,点击添加资源,选择background-image:2、找到我们的图片,选中,点击OK:3、如下:4、再次点击OK,就可以看到效果了:PS:添加进来的是多个填铺的!!!不是一个5、如要在当前前缀下添加更多..._qt插入图片

Java爬虫后台微信小程序之音乐播放器(下)_java爬取微信小程序-程序员宅基地

文章浏览阅读4w次。通过爬虫爬取酷狗的音乐资源首先搜索json数据获取地址:https://songsearch.kugou.com/song_search_v2?keyword=许嵩&page=1&pagesize=30&platform=WebFilter&tag=em&filter=2然后获取关键参数是Hashhttps://wwwapi.kugou.com/yy..._java爬取微信小程序

第二章、数字图像处理的基本运算(基本运算)_要检测同一场景两幅图像之间的变化,最好使用-程序员宅基地

文章浏览阅读7.5k次,点赞6次,收藏40次。一、基本运算1、点运算1、定义设输入图像的灰度为f(x,y),输出图像的灰度为g(x,y),则点运算可以表示为:g(x,y) = T[f(x,y)]T :灰度变换函数其中T[]是对f在(x,y)点值的一种数学运算,即点运算是一种像素的逐点运算,是灰度到灰度的映射过程,称T[]为灰度变换函数。点运算可以改变图像数据所占据的灰度值范围,从而改善图像显示效果。2、点运算的分类点运算..._要检测同一场景两幅图像之间的变化,最好使用

推荐文章

热门文章

相关标签