技术标签: 内存溢出 AndroidMaker OOM 整理 思路 Android
原因:系统为每一个应用程序分配了不同的内存上限,如果超过这个上限被视为内存泄露,从而被kill掉。
比如:
1.加载对象过大
2.相应资源过多,来不及加载。
oom这个真的不好权衡,下面这些注意事项好多是相互矛盾的,根据业务,各取所需吧。
而且一味的追求小内存开销,也不好。
毕竟,硬件本身的性能越来越强大,你不用,它也会老化。
1.加载之前先计算出合适的缩放比例
2.选择合适的解码格式:ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,内存在很大差异。
(比如:带 alpha通道的图片,每个像素的要多消耗2字节的内存
1.复用系统自带的资源:字符串、图片、动画、样式、颜色、简单布局
2.列表(eg:ListView)中对视图的复用
3.实例对象的复用:inBitmap属性可以告知Bitmap解码器使用已经存在的内存区域而不是重新申请一块内存区域
4.避免对象的频繁创建(eg:在onDraw()、循环中创建对象等)
5.StringBuilder替代""+"“的拼接
6.用Integer.toString代替String.valueOf(int)和 int+”"; (因为String会做很多业务上不必要的判断。
(其实这应该算是性能问题了哈:)
比如static对象:因为这玩意和应用进程一样长命
虽然单例模式有效的避免了对象的多出创建,但缺点也在这里:
单例的生命周期和应用保持一致(static),使用不合理很容易出现持有对象的泄漏。(不能正常回收)
考虑使用ArrayMap/SpareseArray而不是传统的HashMap等数据结构。因为HashMap需要一个额外的实例对象来记录Mapping的操作。
因为抽象类这些一般都没有正经的事做。
1.Activity对静态变量的持有问题
2.页面回收时记得清空Handler消息队列
3.Activity Context被其他实例持有
Android不同版本对webview产生有很大差异。
常用的办法:为webview新开一个进程,通过AIDL与主进程通信。(在需要的时候对webView进行销毁
谨慎使用!这可能会影响整个系统的用户体验。
因为这货的优先级一般较高,系统一般不会吧Service所占用的RAM空间腾出来让给其他组件
多进程可以把应用中的部分组件运行在单独的进程当中,系统一般会给多进程分配更多的内存,
但是这会显著增加代码的逻辑复杂度,而且容易成为业界的毒瘤。(这个,,嘛,,
一般你是不会用到一个libraries的所有功能的,这就存在用内存去养那些你压根就不会用的对象
文章浏览阅读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; ..._先定义在初始化
文章浏览阅读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详解
文章浏览阅读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
文章浏览阅读3.2k次。目标图片效果想要实现的图片效果其实上图说白了就是均值加减标准差,上面的线条是用来标示组间比较的。制图清单1.工具: R+Rstudio2.数据准备:需要如下样式的数据。第一列是分组,第二列是均值,第三列是标准差。数据格式3.设置R软件工作目录:为了方便找到结果的图,可以把工作目录设置为桌面。操作如下:工作目录设置4.跑代码:打开Rstudio导入数据运行代码就行了~将数据文件放在桌面,导入数据,注..._matlab对平均值的误差棒
文章浏览阅读8.2k次,点赞3次,收藏42次。1.运算符及其优先级现在归纳一下 LING0 中的三类运算 符:算术运算符、逻辑运算符和关系运算符。算术运算符有 5 种:+(加法),—(减法或负号),*(乘法),/(除法),^(求幂)。逻辑运算符有 9 种:#AND#(与),#OR#(或),#NOT#(非),#EQ#(等于),#NE# (不等于),#GT#(大于),#GE#(大于等于),#LT#(小于),#LE#(小于等于)。逻 ..._lingo中的运算符
文章浏览阅读322次。要解决一个问题,首先要弄清楚问题是什么?也就是分析问题。怎样分析问题呢?分析问题就是要找到问题的一些规律,那就得先从简单入手,有特殊的情况,再到复杂的情况。 注意以后要多思考,多分析问题。查看大公司的招聘试题,同时关注其他方面的信息。_edas 材質分析
文章浏览阅读3k次。jsfunction parseURL(url){ if(!url) return; url = decodeURI(url); var url = url.split("?")[1]; var para = url.split("&"); var len = para.length; var res = {}; var arr = []; for(var i=0;i&l..._js url 中文解析
文章浏览阅读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
文章浏览阅读377次。版权声明:本文为博主原创文章,..._lnmp can't connect to local mysql server through socket '/tmp/mysql.sock
文章浏览阅读3.3w次,点赞11次,收藏54次。【方式一】:1、接下来我们点击界面文件:【Forms下的mianwindow.ui】,拖动一个PushButton进去测试,然后右击这个按钮,选择改变样式表,点击添加资源,选择background-image:2、找到我们的图片,选中,点击OK:3、如下:4、再次点击OK,就可以看到效果了:PS:添加进来的是多个填铺的!!!不是一个5、如要在当前前缀下添加更多..._qt插入图片
文章浏览阅读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、点运算的分类点运算..._要检测同一场景两幅图像之间的变化,最好使用