【问题标题】:How to force a paused process' memory into swap?如何强制暂停进程的内存进行交换?
【发布时间】:2012-05-27 16:55:41
【问题描述】:

我正在寻找改进 UI 以防止内存为 256MB 的 Android 设备滞后的方法。内存非常有限,以至于大型前端应用程序会触发大量其他应用程序的交换。

这个想法是: 如果后台应用程序(例如 Facebook 应用程序)不需要持续运行,例如 telephony,它必须保持不间断,只需暂停该应用程序的进程,并每隔几分钟继续运行一次检索更新,只有当手机在口袋里空闲时,然后再次暂停该过程。

为了减少换出其他应用程序内存的延迟,我希望暂停的应用程序的内存可以主动交换到磁盘/闪存,以便可以根据前端应用程序的需要立即释放 RAM。 (参考速度:10 级 SDHC:10MB/s 写入,所以如果网页需要占用 20MB RAM,浏览器会延迟 2 秒)

所以我的问题是: 如何强制系统将暂停进程的私有内存交换到磁盘/闪存中?

【问题讨论】:

    标签: android memory-management virtual-memory android-lifecycle swapfile


    【解决方案1】:

    如果需要 ram,不活动的进程会自动进入交换,因为他的优先级较低(请参阅 android 上的优先级)。

    理论上,10 级的卡是好的,只能在 2 秒内完成交换,但卡的内存控制器太长了,你将有 5 或 6 秒。 多于 6 级是没有用的。

    【讨论】:

    • 这种机制是从iOS借来的。这种方法的问题是:一个应用的用户体验会受到其他应用的影响。当您的应用 A 收到通知时,请考虑用户正在运行其他应用 B。用户想要切换到 A,但 A 正在等待 B 的“onPause()”完成,然后才能执行操作。除了“应用程序 A 加载缓慢”之外,我认为普通的非技术用户无法理解这里发生的事情。我知道在 Windows 和 Linux 上也会发生这种情况,但在 Win/Lin 上,两个应用程序都会变慢,而不是“只有受害者打开速度很慢”
    【解决方案2】:

    Android 已经处理了暂停应用程序的内存,但与其将进程换出到一些虚拟内存(这可能很昂贵),它可以在需要时将它们转储以释放内存。

    来自The Android Developers documentation - Managing the Activity Lifecycle

    如果一个活动被暂停或停止,系统可以通过要求它完成(调用它的 finish() 方法)或简单地终止它的进程来将它从内存中删除。 Activity 再次打开时(在完成或杀死后),必须重新创建。

    Activity 的onPause() 是保证运行的最后一个生命周期回调,允许它保存其状态,之后 Android 可能会在它认为合适的时候愉快地转储它。

    来自同一文档中的further

    ...如果系统必须在紧急情况下恢复内存,则可能不会调用 onStop() 和 onDestroy()。因此,您应该使用 onPause() 将关键的持久数据(例如用户编辑)写入存储。但是,您应该选择在 onPause() 期间必须保留哪些信息,因为此方法中的任何阻塞过程都会阻止过渡到下一个活动并降低用户体验

    强调

    因此,您可能遇到的瓶颈可能在于应用程序本身,而不是操作系统,并且保存Activity 状态仍然可能比尝试存储整个内存内容要快得多应用程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多