美文网首页
Android如何应对内存回收机制

Android如何应对内存回收机制

作者: 寒_蝉 | 来源:发表于2019-05-13 00:31 被阅读0次

前言

前段时间曾做过一个定制车载OS(基于Linux、Android)的项目,该操作系统的内存不足、内存管理欠佳,并且在定制Linux内核时给Payment、Music等应用分配了较高的进程优先级,导致其余应用总是出现内存被系统回收的情况,时常出现一些匪夷所思的BUG。

Android系统中的进程管理

进程优先级的设置

对于每一个运行中的进程,Linux内核都通过proc文件系统暴露这样一个文件来允许其他程序修改指定进程的优先级:/proc/[pid]/oom_score_adj。(修改这个文件需要root权限)
这个文件允许的值的范围是:-1000 ~ +1000之间。值越小,表示进程越重要。

当内存非常紧张时,系统便会遍历所有进程,以确定哪个进程需要被杀死以回收内存,此时便会读取oom_score_adj 这个文件的值。

进程优先级的影响范围

在Android系统中,进程的优先级影响着以下三个因素:

  • 当内存紧张时,系统对于进程的回收策略
  • 系统对于进程的CPU调度策略
  • 虚拟机对于进程的内存分配和垃圾回收策略

如何提高进程优先级

  1. AndroidManifest.xml中的Application节点内添加android:persistent="true"
  2. 重载back按键事件,让activity在后台运行,不要Destroy;
  3. 启动Service,并设置前台运行方式;
  4. 与NotificationManager交互,让进程变成可感知进程;
  5. 发送/接收广播,进行进程保活。

如何在Activity被销毁时进行数据缓存

当进程不可避免的被销毁时,可以考虑对页面当前数据、部分控件状态进行缓存,这样可以避免部分bug、优化用户体验。

Activity重建时,系统会在销毁前调用onSaveInstanceState方法(调用时序在onStop之前),在重建时调用onRestoreInstanceState方法恢复缓存数据。我们可以重写onRestoreInstanceState方法恢复数据,也可以在onCreate中使用savedInstanceState来恢复数据(需要对savedInstanceState判空)。

实例如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    Log.d(TAG, "onCreate: ");

    //恢复数据位置1(需要对savedInstanceState判空)
    if (null != savedInstanceState) {
        String string = savedInstanceState.getString("cache");
        Log.d(TAG, "onCreate: " + string);
    }
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    //恢复数据位置2(官方推荐)
    String string = savedInstanceState.getString("cache");
    Log.d(TAG, "onRestoreInstanceState: " + string);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("cache", "Cicada");
}

相关文章

  • Android知识大纲

    Android知识大纲 Java垃圾回收机制 Java内存是如何划分的,Java语言为什么要使用垃圾回收机制? 垃...

  • 安卓内存优化

    Android内存 1.Android内存分配与回收机制 从Application Framework、Dalvi...

  • Android 优化

    Android 内存优化内存溢出 , 内存泄漏 , 内存泄漏过多就导致内存溢出 Android 系统垃圾回收机制内...

  • Android系统内存不足时,应用被系统回收发生了什么?

    android系统内存不足时,应用被系统回收发生了什么? Android 操作系统的内存回收机制

  • Android如何应对内存回收机制

    前言 前段时间曾做过一个定制车载OS(基于Linux、Android)的项目,该操作系统的内存不足、内存管理欠佳,...

  • 内存管理

    一、内存管理机制概述 1.分配机制 2.回收机制 二、Android内存管理机制 1.分配机制 根据物理手机的内存...

  • Android内存管理机制

    Android内存管理机制的定义 内存的分配 内存的回收 管理机制的说明 管理的内存对象 进程 对象 变量 管理的...

  • Fragment无法切换问题

    Android有一个回收机制,当内存不足时,会自动回收相关内存。 我们使用FragmentActivity放入Fr...

  • python学习一

    1 python 如何管理内存 对象引用计数机制,垃圾回收机制,内存池机制 一。对象引用机制 python内部引用...

  • IGG:Android内存回收机制原理是什么

    面试官: IGG---Android内存回收机制原理是什么心理分析:面试官对性能优化很高,卡顿和内存回收又很高的...

网友评论

      本文标题:Android如何应对内存回收机制

      本文链接:https://www.haomeiwen.com/subject/frlkaqtx.html