内存不足导致应用进程被杀
2017-11-23 18:23
225 查看
应用处于后台时,如果手机内存不足,应用进程会被强制杀掉. 如果通过最近打开的应用列表回到应用,那么首先会调起Application, 然后会恢复被杀之前的Activity, 如果Activity中含有Fragment, 那么Fragment也会被创建新的实例,但是应用中的其他单例等数据就会被清除。
如果应用在后台,如果系统内存不足,导致应用进程被杀。那么应用中所有在内存中的数据将会被清理,而且系统会保存当前应用的Activity栈信息。
应用进程被杀后,如果从桌面ICON重启,那么应用会像常规启动一样重启,一切都会很正常;如果从最近使用的应用列表中重启,那么系统会根据保存的Activity栈首先恢复栈顶的Activity, 如果用户不断返回上层,那么系统也会依次恢复Activity栈中的所有Activity, 如果含有Fragment, 那么Fragment的实例也会被系统自动创建。当然,不管用哪种方式返回应用,都会先启动Application。
方案:在BaseActivity中代理子Activity的生命周期方法,Activity创建时,根据全局变量判断应用是否是被杀后重启,如果是,不调用子Activity的任何方法,直接启动LaunchActivity, 产生应用重新启动的现象,单例也就都会重新被创建。(方法很山寨,万不得已不要用)参考文章
问题:含有Fragment的Activity,使用MVP模式,应用被杀重启后没有重新创建Presenter。
方案:在Activity的OnCreate中,一定要创建Presenter的实例,不管Fragment是否为null, 都要创建Presenter. 因为应用被杀重启的情况下,内存中的Presenter实例已经被销毁,但是Fragment对象会被系统自行创建,所以在Activity#onCreate方法中会出现Fragment不为null, 但是Presenter为null的现象。
生命周期
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的现象。
测试
模拟应用由于内存不足被杀有很多种方法,大家可以参考这篇文章,讲得很全。相关文章推荐
- Oracle EBS 大量并发请求提交导致内存不足系统杀死Java JVM进程
- 内存不足导致OpenStack进程异常的诊断和思考
- ExtJs4.0在myeclipse里会出现内存不足,导致无法应用的问题解决
- 使用axis2构建webservice时客户端内存不断增长导致应用服务器频繁重启的解决方案 .
- tomcat服务器内存不足导致的无法连接服务器问题解决方法
- 解决进程间共享内存,由于某个进程异常退出导致死锁问题
- 使用axis2构建webservice时客户端内存不断增长导致应用服务器频繁重启的解决方案
- 网络带宽不足引起arc进程争用导致两个standby失败
- 内存不足时Android 系统如何Kill进程
- Apache HttpClient 资源释放、请求超时,导致线程池用光、内存不足
- 捕获由于无效指针导致的内存读写异常,最后导致进程异常中止(仅适用于Windows系统)
- ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法
- react-native ListView加载大量数据时会占用大量内存导致应用崩溃
- android系统内存不足时,应用被系统回收发生了什么?
- ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法
- 怎么解决内存不足以及IE弹出提示:此网页上的问题导致internet explorer关闭并重试
- 内存不足时Android 系统如何Kill进程
- android系统内存不足时,应用被系统回收发生了什么?
- Linux OOM-killer(内存不足时kill高内存进程的策略)