【发布时间】:2016-09-28 20:20:42
【问题描述】:
Android 5.0+ 中 ART 运行时的一个被吹捧的功能是堆压缩,以减少堆碎片。碎片堆可以更轻松地获得OutOfMemoryErrors,因为可能没有一个连续的空闲内存块足以满足您的需求,即使整个堆有足够的可用空间。
我了解,当应用移动到后台时,会发生这种情况,基于 Google 会议演示等。但是,我可以在 the documentation 中找到的唯一声明是:
同构空间压缩是从空闲列表空间到空闲列表空间的压缩,这通常发生在应用程序移动到无法察觉的暂停进程状态时。这样做的主要原因是减少 RAM 使用和对堆进行碎片整理。
从技术上讲,尚不清楚“暂停不可察觉的进程状态”究竟是什么意思。
假设某个应用目前没有任何前台活动。开发人员是否做了任何可能阻止该应用程序进程的堆压缩的事情?例如,是否有前台服务块堆压缩?
【问题讨论】:
-
只是验证你已经阅读了source.android.com/devices/tech/dalvik/gc-debug.html,它谈到了“堆压缩”
Currently, the event that triggers heap compaction is ActivityManager process-state changes. When an app goes to background, it notifies ART the process state is no longer jank “perceptible.” -
@MorrisonChang:不,我错过了那个页面——谢谢!这有帮助,但我不知道如何解释“应用程序进入后台”。如果字面上指的是
IMPORTANCE_BACKGROUND,那么即使有一个正在运行的服务也可能会阻塞堆压缩。 -
似乎您只是想得到保证。您的后台任务相关服务是否遇到任何问题?如果你能想出一个与性能相关的实际问题,那就太好了。关于服务,与前台任务相比,它们的优先级较低,并且从一开始就存在,就像手机内存不足时您的服务将被终止或阻止一样。要深入挖掘,您可以阅读有关粘性 CMS 和对象图的信息,会有所帮助
-
“看起来你只是想得到保证”——我只是想能够告诉开发人员会发生什么,因为这种行为是无证的。 “当手机内存不足时,您的服务将被终止或阻止” - 不,它不会。 Android 终止进程以释放系统 RAM; Android 不会破坏单个组件。此外,这与问题并不严格相关。
标签: android