内存不足导致应用进程被杀
应用处于后台时,如果手机内存不足,应用进程会被强制杀掉. 如果通过最近打开的应用列表回到应用,那么首先会调起Application, 然后会恢复被杀之前的Activity, 如果Activity中含有Fragment, 那么Fragment也会被创建新的实例,但是应用中的其他单例等数据就会被清除。
生命周期
Android的组件都是有生命周期的,与用户交互的Activity和Fragment都有明确的生命周期。编写代码的时候尽量少用单例模式,单例模式的优点很明显:易于共享数据。但是单例模式没有生命周期,不能跟随Activity创建、销毁。
内存不足时会发生什么
当手机内存不足时,系统会根据每个应用的状态按优先级依次销毁应用的进程,以保证优先级高的应用能得到充足的内存。
如果应用在后台,如果系统内存不足,导致应用进程被杀。那么应用中所有在内存中的数据将会被清理,而且系统会保存当前应用的Activity栈信息。
应用进程被杀后,如果从桌面ICON重启,那么应用会像常规启动一样重启,一切都会很正常;如果从最近使用的应用列表中重启,那么系统会根据保存的Activity栈首先恢复栈顶的Activity, 如果用户不断返回上层,那么系统也会依次恢复Activity栈中的所有Activity, 如果含有Fragment, 那么Fragment的实例也会被系统自动创建。当然,不管用哪种方式返回应用,都会先启动Application。
应用重启后的数据恢复
Activity中持有的少量数据可以通过onSaveInstanceState
和onCreate
方法形参中的Bundle
进行存储和恢复。如果使用了单例保存数据,那么重启后单例的数据就不复存在,所以要评估使用单例的风险。参考文章
遇到的问题
问题:应用中有大量情况使用了单例,而且单例中保存的数据很重要。
方案:在BaseActivity中代理子Activity的生命周期方法,Activity创建时,根据全局变量判断应用是否是被杀后重启,如果是,不调用子Activity的任何方法,直接启动LaunchActivity, 产生应用重新启动的现象,单例也就都会重新被创建。(方法很山寨,万不得已不要用)参考文章
问题:含有Fragment的Activity,使用MVP模式,应用被杀重启后没有重新创建Presenter。
方案:在Activity的OnCreate中,一定要创建Presenter的实例,不管Fragment是否为null, 都要创建Presenter. 因为应用被杀重启的情况下,内存中的Presenter实例已经被销毁,但是Fragment对象会被系统自行创建,所以在Activity#onCreate方法中会出现Fragment不为null, 但是Presenter为null的现象。
测试
模拟应用由于内存不足被杀有很多种方法,大家可以参考这篇文章,讲得很全。
内存不足导致应用进程被杀相关推荐
- windows2003中未分页内存泄漏导致服务器不稳定的解决方法
2015年天互进行了内部员工干货分享计划,让销售.技术.客服.市场.行政五大体系的员工把自己工作中的干货内容分享给大家,共同提高业务能力和工作效率.本篇内容来自虚拟产品部姚运的技术日志分享," ...
- python2执行程序内存溢出导致被killed的问题因果分析
问题来源: 执行一段程序,对某个函数重复执行,当执行到一半时,就显示被killed,重复几次均如此.为什么会这样呢? 第一步.定位被killed的根本原图: 使用vi /var/log/message ...
- 硬核分析|腾讯云原生OS内存回收导致关键业务抖动问题
实战系列: 精选各种常见的代表性实际问题,分享一步一步思考和解决方法,梳理整个问题脉络,可以学习到解决问题各种技巧和通用技能,锻炼解决问题思维能力,让大家成为解决问题的高手: 往期文章推荐: 一个刁钻 ...
- drools规则引擎因为内存泄露导致的内存溢出
进入这个问题之前,先了解一下drools: 在很多行业应用中比如银行.保险领域,业务规则往往非常复杂,并且规则处于不断更新变化中,而现有很多系统做法基本上都是将业务规则绑定在程序代码中. 主要存在的问 ...
- 32位Windows系统未分页内存限制导致的VPS的容量问题
问题 32位Windows系统未分页内存限制导致的VPS的容量问题 解决方案 在32位的Windows系统上,制约VPS的数量的主要参数是"未分页内存" 打开Windows自己的任 ...
- 由SGA组件内存移动导致前台业务超时问题处理过程
墨墨导读:Oracle 11g推出了自动内存管理(AMM)新特性,该特性引入后,虽然减轻了DBA手动设置共享内存的负担,但是会存在不稳定的情况,经常出现在shared pool和buffer cach ...
- 内存回收导致关键业务抖动案例分析-论云原生OS内存QoS保障
蒋彪,腾讯云高级工程师,10+年专注于操作系统相关技术,Linux内核资深发烧友.目前负责腾讯云原生OS的研发,以及OS/虚拟化的性能优化工作. ## 导语 云原生场景,相比于传统的IDC场景,业务更 ...
- Android6.0以上应用在长时间在后台,因为内存不足导致系统回收内存,当再次启动应用出现Fragment重叠或者空白、异常解决方案(提供模拟内存不足导致系统回收内存的方案)。
Android6.0以上应用在长时间在后台,因为内存不足导致系统回收内存,当再次启动应用出现Fragment重叠或者空白解决方案. 首先提供一个方法模拟内存不足导致系统回收内存的方案: 打开Andro ...
- 服务器内存不足导致程序(tomcat)崩溃
服务器内存不足导致程序(tomcat)崩溃 场景 场景 在同一台服务上部署了多个tomcat,每个tomcat上都运行项目: 通过命令netstat -ntlp查看运行的java进程及对应的端口信息 ...
最新文章
- ant-design-pro Login 中的 UserName 和 Password 的验证规则 rules
- bzoj3224: Tyvj 1728 普通平衡树(splay)
- leetcode - Missing Ranges
- Spring实战第七章
- 玩转java并发工具_玩Java并发
- Serverless 架构到底要不要服务器?
- 为 Windows 用户准备的简明 Linux 词汇表
- drools 7.11 复杂事件处理详解
- Scikit-Learn与回归树
- POJ - 2392 朴素多重背包 + 贪心 WA与AC代码细节分析
- 误删除 Oracle 数据库数据的恢复方法
- python version 3_VIM设置python3支持和检测python version
- 打包下载 java_java实现文件打包下载
- LED灯恒流驱动电路设计
- Linux系统基于MobaXterm的下载及使用
- Win系统 - Win10 进入 BIOS 系统(非启动快捷键)
- 腾讯云MySQL备份本地恢复
- 国外EDU教育邮箱功能简介
- #力扣 LeetCode35. 搜索插入位置 #在所有 Java 提交中击败了 100.00% 的用户 @FDDLC
- charles安装证书并信任证书,仍然无法获取手机上的请求
热门文章
- 彩票开奖系统PHP,彩票开奖API接口_免费数据接口 - 极速数据
- H5新特性 - 拖拽属性
- Task01算法的规范化和量化度量
- linux下mysql乱码,Linux下mysql中文乱码解决方案
- R沟通|提升xaringan幻灯片的b格
- Postman自动更新后打不开,collections接口目录突然消失
- Maven项目配置Tomcat
- *.github.io的个人博客网站无法连接的问题
- 朋友圈加粗字体数字_独家:微信更新!公众号改版,朋友圈视频号直播置顶支持一键关闭...
- 9个绝招巧妙应付公司各类人