这篇文章主要想记录一下在排查线上 OOM 问题时的分析思路和解决方案,同时思考了如何优化监控 Android 应用的内存。
线上 OOM 问题案例
目前维护的应用主要存在两类 OOM 问题
1.创建线程时抛出 OOM 异常(只出现在华为手机上,华为手机对应用可创建的最大线程数做了约束)
2.Fresco 加载图片申请内存时虚拟机内存不足
这篇文章主要想记录一下在排查线上 OOM 问题时的分析思路和解决方案,同时思考了如何优化监控 Android 应用的内存。
目前维护的应用主要存在两类 OOM 问题
1.创建线程时抛出 OOM 异常(只出现在华为手机上,华为手机对应用可创建的最大线程数做了约束)
2.Fresco 加载图片申请内存时虚拟机内存不足
在开发加密解密数据的时候碰到需要把加密好的 byte 数组转换成 String 对象用于网络传输的需求,如果把字节数组直接转换成 UTF-8 等编码方式的话肯定会存在某些编码没有对应的字符,在传输过程中会遗漏数据。这时就可以通过常用的二进制数据编码方式 Base64 编码或者 Hex 编码来实现。
因为一个字节中存在8个 bit可以表示256个字符,而 ASCII 码只能表示0-127种字符,为了能完整地表示一个字节,可以将二进制数据转换为十六进制数据的方式来实现。所以 Hex 编码也被称作为 Base16 编码,相比于原先8位表示一个字节,Hex 编码能够只用2位表示一个字节。Hex 编码最常用于二进制文件查看时展示的编码,如 Hex Fiend 就可以支持查看二进制文件。
找了几个月的实习终于找到了实习的去处——小米互娱,做的是小米直播和米聊的业务,经过快大半年的实习,谈谈自己在这个业务部门实习的感受吧。
小米这边用的团队管理工具主要是 Atlassian 的 Confluence 和 Jira ,Confluence 主要用于团队内部的 wiki 记录,会议记录以及代码规范,api 文档,需求文档等一系列部门合作会使用参考的文档,而 Jira 主要用于 bug 的跟踪管理。公司内部的邮件我们开发组收到的主要是用户量分布,留存率,请求接口的日成功率,视频的推拉流状况,新的需求,设计稿邮件等,基本上每天来公司第一件事情就是看邮件,看自己头上有什么任务,然后安排下就开始工作了。
再说下各组间协作的流程:首先是产品经理提出需求,然后客户端老大,产品经理老大,项目经理会对每一期的需求进行评审(每一期就是产品的一个小版本的上线间隔时间:大概一到两个星期),评审通过决定要在下一个版本加进这个需求后开始安排人员进行设计,协定接口等一系统工作,首先提出需求的产品和设计师,客户端开发,后台开发会对这个需求进行讨论评估好工期,对需求的细节方面做些评估完善,约定好接口,通常这时候产品是已经给出了原型图的,所以客户端根据原型图就能大概评估出需要多少时间来开发。接着设计师开始出设计稿和切图,客户端根据约定好的接口开始开发,通常后台那边开发好后会先上 测试环境下的接口,再上正式环境下的接口,正式环境的上线他们有个规范的上线流程和紧急情况下的处理措施。设计师那边全部都用 sketch 出图,通过插件将 sketch 导出为 html 文件发送邮件给客户端,客户端开发好后现在测试环境下测试,自测通过后交给产品和设计验收,验收通过即可提交给测试组测试。测试组这时候如果在你的模块下测出 bug 就会在 Jira 上提出 bug,在上线前你头上所有优先级高的 bug 都得修复完毕才能上线。
Retrofit 和 OkHttp 是现在常用的网络框架,在处理复杂的网络请求方面极大地简化了开发者的工作。下面总结下自己在开发过程中常用的配置。用到的Retrofit版本为2.2,OkHttp版本为3.6。
|
|
Retrofit 2 中已经集成了 OkHttp,所以只要导入 Retrofit 就行了。主要就是对 OkHttpClient 进行配置,因为网络请求的底层实现主要靠它,Retrofit 只是做了上层封装。
|
|
几周前我很荣幸地去波兰参加了Mobiconf,对于移动开发者来说是最好的会议之一。我的朋友兼同事 Jorge Barroso做了名为“最佳实践”的演讲,其中有这么一句话让我听后很有感触:
如果你是一个 Android 开发者但你不使用 WeakReferences ,那这是有问题的。
举个恰当的例子,几个月前我发布了我最后一本书,“Android High Performance”,Diego Grancini作为联席作者。其中最受欢迎的章节是讨论 Android 中的内存管理。在这个章节中,我们讲了在移动设备上内存是如何工作的,以及内存泄露是怎么发生的,为什么这很重要,和使用什么技术来让我们避免内存泄露的发生。自从我开发 Android ,我总是看到轻视甚至不管内存泄露和管理的这种倾向。如果需求已经满足了,为什么要自寻烦恼呢?我们总是急于开发新的功能,我们更倾向于在下一个 Sprint 演示中加入可见的东西而不关注那些人们不能第一眼就看见的东西。
在2016年经历了很多:接触了华师匣子的项目,学习实践各种框架的使用,学习 Node,参加 Hackthon,GDD…这一年过得很快,也相对过得比较充实。
从年初开始的冬令营,接触一个简单的“实验版”的校园通项目并把它实现,在这过程中接触到了工程化的思想和懂得了代码规范的重要性,为之后的华师匣子项目的合作打下了基础。
项目开始的时候大概在五月份,所以在这之前都是学各种框架的使用,接触的都是主流的框架:Retrofit,greenDao,RxJava…那个时候对 RxJava的理解感觉还是很抽象,虽然看着好像都懂,但实际用起来却不知何从下手,只能模仿别人的代码写异步的部分,但配合Lambda 表达式看起来确实是很简洁优雅。
12月14号去上海参加了 google 开发者大会,这是我第一次参加开发者大会,头次参加开发者大会自然是很期待的.这次大会不同于其他国内的一些大会(介绍业内的开发经验),大会主要是介绍 google 的最新技术和开源项目.
刚开始的开场前预热是用Tilt Brush创作的3D 立体绘画表演,佩戴 VR 描绘上海 google 开发者大会的外景.接着 google 的产品总监,销售副总裁和 Angular 的项目负责人作了大会内容的简要介绍以及 对google 产品进行宣传.其中 google 的产品总监Andrew Bowers上台开始说了几句中文,以为他要用中文演讲,没想到他最后来了句他对他中文的评价是 “我对我的中文只能呵呵” ,接着开始用英文演讲hh.
接下去的几场都听了 Android 的,一些 Android 的演讲其实在 youtube 的 Android Developer 频道已经有发布了,只是做了部分的修改.
记录一下之前没有注意到到的功能: