OOM问题解决实践
一、项目背景
我们的项目是一款致力于解决大学课堂教学效率低下、教师学生课堂教学互动性不强这一现实问题而设计的独立的课堂教学辅助系统。系统主体分为两个相互关联的软件。E课的pc端的用户是大学授课教师,E课APP是服务学生的Android端软件。“E课”软件PC端的用户是大学授课教师,基于授课需要,教师需要考察学生出勤情况,了解学生课堂实时学习情况,展示相关教学资料。“E课”APP的用户是学生,学生在合适的时间使用手机软件与教师进行交互,提高课堂效率与课堂互动性。
“E课”是一项独立的软件,而且全部内容自含。在“E课”智能手机应用程序中,教师可通过个人邮箱和密码登录系统,学生可通过本人学号和加密码登录系统。显示页面所需要的数据全部从数据库中读取,以APP界面或者网页的形式列在页面上供使用者浏览。“E课”可实现课表查询、扫描二维码即时签到、课程检测、“我要当学霸”、在线课程中心等主要功能以及绩点查询、成绩查询等辅助功能,实现以新媒体辅助教学的方式提高课堂效率。
系统架构图如下:
文章图片
学生用户端主要功能有:加入课程、签到、课堂检测、文件下载、课堂笔记、个人签到记录等核心功能,还有大学新闻公告展示推送、学生课表自动导入及展示、个人信息、成绩查询等辅助功能。PC端功能总览图如下:
文章图片
二、所遇到的挑战
本项目在测试及小范围用户使用的过程中,发现了会存在OOM 的问题。 OOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”,即会抛出java.lang.OutOfMemoryError的异常。看下关于的官方说明: Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector. 意思就是说,当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个error(注:非exception,因为这个问题已经严重到不足以被应用处理)。
三、解决问题的步骤
首先,我们先进行问题的排查,因为发生OOM的可能性和原因有很多。但无外乎底层原因就两点,一种是分配得少:比如虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少;另一种是应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。(内存泄露:申请使用完的内存没有释放,导致虚拟机不能再次使用该内存,此时这段内存就泄露了,因为申请者不用了,而又不能被虚拟机分配给别人用。内存溢出:申请的内存超出了JVM能提供的内存大小,此时称之为溢出。)
常用的工具有常用的工具有:
1)mat: eclipse memory analyzer, 基于eclipse RCP的内存分析工具。详细信息参见:http://www.eclipse.org/mat/,推荐使用。 2)jhat:JDK自带的java heap analyze tool,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言OQL,分析相关的应用后,可以通过http://localhost:7000来访问分析结果。不推荐使用,因为在实际的排查过程中,一般是先在生产环境 dump出文件来,然后拉到自己的开发机器上分析,所以,不如采用高级的分析工具比如前面的mat来的高效。
进行了几轮的测试与排查,首先发现是-Xmx 参数过低,调高之后便解决了部分问题;后发现数据库查询逻辑有些问题,一次性查询了数据库全部结果,而没有做结果数限制,所以当测试的数据库信息量过大的时候,也会出现OOM的问题,于是我们尝试从逻辑层面优化了数据库查询机制,从而又更高层面地减少了OOM问题的发生。
因为发现了软件潜藏的可能性问题,加强了我们的监控维护意识,毕竟测试只能解决部分和少量非常明显的问题,但是在实际上线过程中,突然爆发出来的问题可能会是毁灭性的,于是我们决定要完善监控体系。只有这样,才能更好的服务于用户,尽快发现问题,并解决例如适配性、用户体验、流量使用、稳定性等问题。我们调研了几个常用的用户反馈平台1) 美洽,基于HTML5开发,只需在IOS/Android支持H5的浏览器中打开即可,无需安装任何软件程序,代码植入,一步到位,简化沟通流程。
2) Udesk:支持Android、IOS以及APIcloud三大平台,可以对用户反馈的数据做统计分析,并展示结果。
3) Freshdesk,致力于中小企业网站在线客服技术支持的网站,提供中小企业网站的在线服务质量和用户体验度。在调研过程中,我们偶然接触到了友盟+ 应用性能监控平台 U-APM,U-APM应用性能监控平台提供实时、可靠、全面的应用崩溃、ANR、自定义异常等捕获能力,支持多场景、多通道智能告警监控,高效还原崩溃用户的访问路径和业务现场,缩短故障排查时间。其提供从发现问题---还原问题---解决问题----验收的完整闭环。完美符合我们的需求和预期。
四、项目总结
【OOM问题解决实践】我们的项目最终定位在“适配普通大学课堂教学的教学辅助软件”,旨在提高大学课堂效率和教学互动性,在功能层面上尽量做到简洁,在开发层面尽量做到统一规范。PC端和Android端均符合了MVC软件设计模式,具有了较好的可移植性,模块之间高度解耦,可适应各种类型的再开发。但在APP测试期间出现了OOM的问题,于是我们通过调高-Xmx参数,并修改了数据库查询逻辑,优化代码结构,同时完善监控体系的方法解决优化了这个问题,并且完善了监控体系对后续未来可能会发生的问题提供了双重保障。
推荐阅读
- parallels|parallels desktop 解决网络初始化失败问题
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- jhipster|jhipster 升级无效问题
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- “精神病患者”的角度问题
- SpringBoot调用公共模块的自定义注解失效的解决
- 解决SpringBoot引用别的模块无法注入的问题
- Hive常见问题汇总
- 姚老师互动问答会|姚老师互动问答会 # 问题001(如何更有智慧的和身边人分享金刚智慧())
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题