扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
在处理app启动速度的时候,可以设置主线程的优先级,保证主线程占用的cpu足够久。进程的oom_adj,决定了当内存不够的时候,lmk会根据oom_adj的大小依次释放内存。
成都创新互联专注于企业营销型网站建设、网站重做改版、江门网站定制设计、自适应品牌网站建设、HTML5建站、商城网站建设、集团公司官网建设、外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为江门等各大城市提供网站开发制作服务。
android中对线程等级划分如下:
设置线程的优先级分为:android 提供的api和java sdk自带的api
注意: 要使用android提供的api设置,用java提供的作用不够显著
作用: 可以在主线程设置主线层等级;在Glide加载图片的时候设置低优先级。当图片量很大的时候可以降低加载图片线程的等级
android内存不够了,会触发oom机制,lowMemoryKiller会根据每个进程的oom_adj的等级,依次杀死进程,释放内存。
lom会根据free的内存的值,来判断kill掉哪个等级下的进程。例如当空闲内存只有64M了。会kill掉oom_adj 为12-15的进程
真实案例:应用A跳到第三方应用B,在第三方应用B中播放视频,加载大量图片,导致返回的时候,应用A走了SplashActivity。通过logcat发现A应用被kill掉了
Android oom 有时出现很频繁,这一般不是Android设计的问题,一般是我们的问题。
就我的经验而言,出现oom,无非主要是以下几个方面:
一、加载对象过大
二、相应资源过多,没有来不及释放。
解决这样的问题,也有一下几个方面:
一:在内存引用上做些处理,常用的有软引用、强化引用、弱引用
二:在内存中加载图片时直接在内存中做处理,如:边界压缩.
三:动态回收内存
四:优化Dalvik虚拟机的堆内存分配
五:自定义堆内存大小
首先要说一点,就是在Android中线程数超过一定量,也会抛出OOM,所以OOM不一定是内存不足了才会抛出OOM。
具体数量的问题,每个厂商、每个具体型号的手机最大数量都不太一样,华为有些手机限制400多个,默认的话应该是1000多个。
如果是第一次创建的时候就出错,那试试在创建bitmap的时候不要把public static Bitmap createBitmap (int width, int height, Bitmap.Config config)的第三个参数写成ARGB_8888,换成其他的值。
如果是多次创建的时候才OOM,那么一定要想办法,在合适的地方,对你已经创建的bitmap进行recycle操作。
头些年的设备内存容量小,dalvik虚拟机被设置为16M内存运行,为了保留足够的内存,对于bitmap限制为一半,即8M,8M是个什么概念呢,如果RAGB8888格式的图片,8M就是800万像素的图片,一般的手机都可以达到甚至超过这个标准。所以通常出现OOM都是在以前的设备上运行解码图片的时候产生的。
比较新的版本SDK支持配置largeheap选项,会得到一个较大的运行内存,再加上这两年设备的内存容量大大增加,几乎可以与PC相当,这个问题就没那么容易出现了。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流