【问题标题】:On Android, what's the difference between running processes and cached background processes?在 Android 上,正在运行的进程和缓存的后台进程有什么区别?
【发布时间】:2013-01-10 13:52:08
【问题描述】:

在Android上,当我查看“设置”->“应用程序”时,在“运行”选项卡下,我可以看到内存被分成几部分:“已用内存”和“可用内存”,还有应用程序要么放入“已用内存”,要么放入“可用内存”。 “内存空闲”部分的应用程序被称为“缓存后台进程”。

那么,什么是“缓存的后台进程”?它们仍在内存中,而不是切换到“磁盘”(就像台式机/笔记本电脑那样),对吗?当用户选择这些“缓存的后台进程”之一时,它会立即显示,因为它仍在内存中,就像一个正在运行的进程一样,对吧?

Android 在“缓存”应用程序时会做什么?

【问题讨论】:

    标签: android background-process


    【解决方案1】:

    那么,什么是“缓存后台进程”?

    由于您要求对设备 UI 中列出的内容进行技术解释,因此如果设备制造商选择修改“设置”应用,则定义可能因设备而异。

    话虽如此,“缓存的后台进程”通常是指没有前台活动且没有正在运行的服务的进程。这些进程保存在内存中只是因为我们有足够的内存来执行此操作,因此,正如您所注意到的,用户可以快速切换回这些进程。随着 Android 开始需要更多系统 RAM 用于其他进程,“缓存的后台进程”往往是被终止以释放系统 RAM 的进程。

    “缓存后台进程”的突出示例是用户启动应用程序,短暂浏览它,然后按 HOME 返回主屏幕。如果该进程没有正在运行的服务,我希望它会被列为“缓存的后台进程”。

    它们仍在内存中,而不是切换到“磁盘”(就像台式机/笔记本电脑那样),对吧?

    正确。 Android 设备不使用交换空间。

    【讨论】:

    • 很好的解释!我还注意到缓存应用程序时应用程序使用的一些数据可能会丢失。例如。我看到一个优酷视频,然后按“主页”按钮,然后切换回视频,发现它从头开始加载。这种理解对吗?
    • @JackWM:这取决于应用程序及其编写方式。
    • 好吧,你的意思是这是应用作者指定的,对吧?通过“onPause()”函数?一个App在缓存的时候能保持的数据大小有什么要求吗?
    • @JackWM:“对应用缓存时可以保持的数据大小有任何要求吗?” - 与它在前台时没有什么不同。应用程序可以选择在不在前台时减少其内存消耗,并且可能有助于将其进程保持更长的时间,但没有任何要求。除此之外,无论进程处于前台还是后台,堆大小限制都是相同的。
    • “Android 设备不使用交换空间”是什么意思?我认为当内存不足时应用程序可以被杀死,但可以用以前的状态重建,这意味着 Android 以某种方式使用交换。不是交换吗? Android 系统确实提供了保存当前状态的机会,并在用户返回时恢复它。
    【解决方案2】:

    为什么不看看"Setting" app's source code

    在我的 Nexus 4 中,“设置”->“应用”->“运行”如下所示。


    在开始之前,Android 进程的重要性层次结构中有五个级别。这些是

    1) 前台进程,
    2)可见过程,
    3) 服务流程,
    4) 后台进程,
    5) 清空进程

    您可以在"Processes and Threads" document in Android Developer site找到更多详细信息。

    我确实查看了代码,结果发现“SHOW CACHED PROCESSES”显示了那些重要性等级等于或低于“后台进程”的进程。另一方面,“SHOW RUNNING SERVICES” 显示那些重要性等级等于“可见进程”或更高的人。我删除了一些细节以清楚地显示要点。可以看这部分的完整源码here

    try {
            final int numProc = mAllProcessItems.size();
            int[] pids = new int[numProc];
            for (int i=0; i<numProc; i++) {
                pids[i] = mAllProcessItems.get(i).mPid;
            }
    
            ...
    
            for (int i=0; i<pids.length; i++) {
                ProcessItem proc = mAllProcessItems.get(i);
                changed |= proc.updateSize(context, pss[i], mSequence);
                if (proc.mCurSeq == mSequence) {
                    serviceProcessMemory += proc.mSize;
                } else if (proc.mRunningProcessInfo.importance >=
                        ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
                    backgroundProcessMemory += proc.mSize;
                    MergedItem mergedItem;
                    if (newBackgroundItems != null) {
                        mergedItem = proc.mMergedItem = new MergedItem(proc.mUserId);
                        proc.mMergedItem.mProcess = proc;
                        diffUsers |= mergedItem.mUserId != mMyUserId;
                        newBackgroundItems.add(mergedItem);
                    } else {
                       ...
                    }
    
                   ...
    
                } else if (proc.mRunningProcessInfo.importance <=
                        ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
                    foregroundProcessMemory += proc.mSize;
                }
            }
        } catch (RemoteException e) {
        }
    


    所以,回到你的问题,

    它们仍在内存中,而不是切换到“磁盘”(就像台式机/笔记本电脑那样),对吧?

    是的,它们仍在内存中,但最终 Android 系统可能需要删除旧进程,以便为新的或更重要的进程回收内存。为了确定保留哪些进程以及终止哪些进程,系统将每个进程置于“重要性层次结构”中。

    当用户点击这些“缓存的后台进程”之一时,它会立即显示,因为它仍在内存中,就像正在运行的进程一样,对吧?

    正确。例如the only reason to keep "Empty process" alive is to improve startup time the next time a component needs to run in it.

    Android 在“缓存”应用程序时会做什么?

    AFAIK,它根本不会终止进程并保留资源,以便在用户返回时立即响应用户。

    【讨论】:

    • 我有更干净的应用程序,它正在释放正在运行的进程的缓存你在做什么你能告诉我如何找到进程的缓存大小并释放缓存大小吗?@Javatar @congliu
    【解决方案3】:

    进程等级

    Android 操作系统会尽可能长时间地保持应用程序运行 尽可能,但是当可用内存不足时,它会尝试释放内存中的资源 系统首先杀死重要性较低的进程。

    这是流程排名出现的时候; Android进程是 从高优先级到低优先级在接下来的五个类别中排名:

    • 前台进程:这是一个托管活动或服务的进程, 用户当前正在与之交互:在前台启动的服务或 运行其生命周期回调的服务
    • 可见进程:这是一个托管暂停活动或服务的进程 绑定到可见活动
    • 服务进程:这是一个托管服务的进程,该服务未绑定到 可见活动
    • 后台进程:这是一个承载不可见活动的进程;全部 后台进程按最近最少使用 (LRU) 列表排序, 因此,最近使用的进程是最后杀死的进程 他们
    • 空进程:这是一个用于缓存非活动Android组件的进程 并改善任何组件的启动时间

    当系统达到需要释放资源的程度时,进程 可被杀死的将被排序,考虑到进程排名,最后使用 进程和组件正在运行。

    来源

    异步 ​​Android 编程 - 第二版 - Helder Vasconcelos - 2016 年 7 月

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 2012-11-16
      • 2010-09-17
      相关资源
      最近更新 更多