文档章节

如何优化app的运行内存占用

1071954237
 1071954237
发布于 2016/11/03 14:29
字数 1029
阅读 33
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

在开发过程中,我们经常会遇到RAM不够用的问题,那么我们应该如何优化我们的App,使他占用的RAM更少呢?下面,介绍几个方法吧(也可以说是几个原则):

一、尽量减少Service的使用: 当你的app需要使用service来处理后台任务的时候,要保证当前的任务完成时,该service也要停止。另外,要注意的是,当停止这个service的时候,不要引起它的泄漏。 当启动一个service之后,系统总会保持这个service处于运行状态。这样,就会占用大量的RAM。所以,app的运行效率就会因此降低。 保留没有用的service最可怕的内存管理错误。所以,一定要牢记,没有必要使用service的时候就不用,用完了一定要记得将它销毁!!!!

二、尽量动态注册BroadCastReceiver使用: 如果一个BroadcastReceiver 用于更新UI,那么通常会使用这种方法去注册,在Activity启动时注册BroadcastReceiver ,在Activity不可见以后取消注册。

三、当界面变为不可见时,要记得释放内存: 当用户跳转到其他界面时,并且当前界面不再可见的时候,要记得释放当前这个界面中的资源。 当用户退出某个界面时,记得在你的activity中实现onTrimMemory()(api4.0及以上)这个回调方法。调用这个方法,系统会收集不需要的内

四、当内存变少时,释放内存: 在你的app运行过程中,当运行该app的设备所剩的RAM变得很少时,系统就会调用onTrimMemory()这个方法,这个方法中有几个参数,表示不同的状态。onTrimMemory()的具体使用,还请大家参加Android的开发文档吧,本人手懒,就不详细介绍啦。

五、检查你所需要使用的内存: 可以通过getMemoryClass()估计一下你的app可用的heap。当你的app所需要的内存超过了这个可用值时,好了内存溢出就出现了。 这里有一个很特殊的方法,可以通过在manifest <application>标签中将largeHeap的属性值设置为true来请求更大的内存,主要注意的是,如果你采用了这种方法,那么当你想要获取可用内存时,就要使用 getLargeMemoryClass()。 不过由于每台机器的RAM是有限的,所以用这个还是小心吧,不需要用的时候还是不用了吧。

六、避免由bitmap引起的内存浪费:
bitmap还是很占内存的啊,当我们使用它的时候一定要小心。有几个需要注意的方法:

1、不要直接使用这样会占用很大的内存,使用BitmapFactory.Options设置inSampleSize,根据手机屏幕大小来设置bitmap的大小, 这样做可以减少对系统资源的要求。

2、缓存图像到内存,采用软引用缓存到内存,而不是在每次使用的时候都从新加载到内存;

3、采用低内存占用量的编码方式,比如Bitmap.Config.ARGB_4444比Bitmap.Config.ARGB_8888更省内存;

4、最后就是最重要的一点,当bitmap使用完之后一定要记得回收!!!

七、使用优化过的数据容器 尽量使用 SparseArray, SparseBooleanArray, LongSparseArray 等经过优化的容器类。通常来说HashMap的效率时比较低下的。

八、小心使用抽象类(方法) 适当的使用抽象类和方法能够使我们的代码更加灵活、易维护,但是这样会增加app的内存占用。所以,那些无关痛痒的东西,还是别抽象了吧。

除了以上列举的方法之外还有一些其他的方法,比如:优化布局,尽量减少没有必要的layout嵌套,多次使用一个layout时,可以使用<include> 标签,根布局有时候可以使用<merge>标签等。 先列举这么多,欢迎大家补充,互相学习

© 著作权归作者所有

1071954237
粉丝 3
博文 97
码字总数 36187
作品 0
程序员
私信 提问
性能优化——内存泄漏(1)入门篇

内存泄漏系列文章: 性能优化——内存泄漏(1)入门篇 性能优化——内存泄漏(2)工具分析篇 性能优化——内存泄漏(3)代码分析篇 一、简述 本篇是作为内存泄漏入门,主要说的是一些关于内存...

CSDN_LQR
2017/06/29
0
0
某大厂,iOS高级开发精选面试题!

前言 为防止背题,大部分题目不设标准答案,重点考察面试者的基础知识和思维逻辑,答案的提示见后面。 正文 题目1、举例两个遇到过印象深刻的外网Crash,并介绍如何发现、定位、解决; 题目2...

_小迷糊
02/14
0
0
【腾讯开源】iOS爆内存问题解决方案-OOMDetector组件

组件介绍 OOMDetector是手Q自研的IOS内存监控组件,腾讯内部目前已有多个App接入了OOMDetector,它主要有以下两个功能: 爆内存堆栈统计:负责记录进程内存分配堆栈和内存块大小,在爆内存时...

腾讯开源
2018/01/13
559
0
新鲜出炉的腾讯音乐iOS面试题

前言 为防止背题,大部分题目不设标准答案,重点考察面试者的基础知识和思维逻辑,答案的提示见后面。 正文 题目1、举例两个遇到过印象深刻的外网Crash,并介绍如何发现、定位、解决; 题目2...

落影loyinglin
2018/07/16
0
0
TensorFlow Mobile模型压缩

前言 前文中我们把训练好的模型打包成GraphDef文件(PB文件)了,可是打包出来的文件还是有点大;移动设备的内存容量有限,而且我们需要下载模型到移动端去加载,所以一个大的模型要经过压缩...

Jcme丶Ls
2017/06/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx反向代理+负载均衡+服务器宕机解决办法

反向代理 作用:保证系统安全,不暴露服务器IP,利用nginx服务器,利用内网ip进行访问,避免出现攻击服务器的情况 启动本地tomact,127.0.0.1:8080可以访问到tomcat管理页面 效果:通过 bbs....

Jack088
21分钟前
2
0
返回IEnumerable 与IQueryable相比 [关闭]

返回IQueryable<T>与IEnumerable<T>之间有什么区别? IQueryable<Customer> custs = from c in db.Customerswhere c.City == "<City>"select c;IEnumerable<Customer> custs = from c i......

技术盛宴
28分钟前
2
0
开放下载 | 《Knative 云原生应用开发指南》开启云原生时代 Serverless 之门

点击下载《Knative 云原生应用开发指南》 自 2018 年 Knative 项目开源后,就得到了广大开发者的密切关注。Knative 在 Kubernetes 之上提供了一套完整的应用 Serverless 编排服务,让应用开发...

阿里巴巴云原生
32分钟前
2
0
解密淘宝推荐实战,打造 “比你还懂你” 的个性化APP

手淘推荐简介 手淘推荐的快速发展源于2014年阿里“All in 无线”战略的提出。在无线时代,手机屏幕变小,用户无法同时浏览多个视窗,交互变得困难,在这样的情况下,手淘借助个性化推荐来提升...

阿里云官方博客
35分钟前
2
0
内核程序中进程的pid,handle,eprocess之间相互转换的方法

在内核程序开发中,我们常常需要取得某进程的pid或句柄,或者需要检索进程的eprocess结构,很多API函数需要的参数也不同,所以掌握pid<->handle<->eprocess相互转换的方法会大大提高我们的开...

simpower
37分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部