首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果Android需要更多的内存,它能决定扔掉什么呢?

如果Android需要更多的内存,它能决定扔掉什么呢?
EN

Stack Overflow用户
提问于 2014-03-04 14:26:53
回答 3查看 229关注 0票数 2

我们正在开发一个应用程序,需要前台服务来收集数据。我试图了解Android是如何处理进程和它的活动的,如果它是绑定到前台服务的话。

如果Android需要更多的内存,它能决定扔掉什么呢?整个过程还是仅仅是活动?什么是预期的行为?

后续问题:我们应该倾听哪些事件,以确保我们在发生这种情况时被发出信号?Activity.onDestroy?它肯定会被解雇吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-04 15:03:58

整个过程还是仅仅是活动?

Android终止进程。您可以自己处理掉活动(例如,调用finish()),当它们被垃圾收集时,Android可以将部分堆空间返回给系统。然而,Android并不是以这种方式主动地去除单个组件--这是整个过程,否则什么也不做。

后续问题:我们应该倾听哪些事件,以确保我们在发生这种情况时被发出信号?

当您的进程终止时,不会调用任何内容。

票数 1
EN

Stack Overflow用户

发布于 2014-03-04 15:22:23

实际上,如果Android需要内存,它将终止您的整个进程。

活动被释放,并在被销毁后成为垃圾收集的候选对象,释放进程中的空间。释放进程中的空间对Android可用的内存没有影响。

Activity.onDestroy被称为最大努力.可以在不调用其onDestroy方法的情况下销毁活动。onPause得到了保证。

安卓为每个进程分配了一个优先级,一个介于-15到16之间的数字,称为oom_adj。数量越多,一个过程就越有可能被杀死。只有系统应用程序的oom_adj < 0。当前可见的应用程序的oom_adj为0。一个进程没有UI,但是正在运行的服务将在4-5区域。不可见且没有正在运行的服务的进程具有更高的oom_adj,而不在后端堆栈中的进程的值将最高。

每个设备都有一个编译表,这是Android系统的一部分,它将oom_adj值与低内存条件相关联。例如,这个表表示,如果Android的内存降到了最后的8M,那么它应该杀死任何oom_adj为12或更高的进程。随着内存状况变得更加糟糕,Android可以用越来越低的oom_adj杀死进程。

当Android因为需要内存而扼杀您的进程时,它会使用相当于杀死-9的方法。

票数 2
EN

Stack Overflow用户

发布于 2014-03-04 15:26:57

如果系统认为Android组件占用过多内存,它的进程将被终止。

但是,由于您使用的是前台服务,所以Android将尽力不扼杀您的进程,直到内存资源非常低。对于您的活动,您应该覆盖onSavedInstanceState以保存您的数据,以防您的活动在此场景中被终止。

此外,为了使您的进程被系统杀死以回收资源,您应该尽可能地减少内存占用。您可以在两个进程中将服务和活动组件分开,因为该活动及其UI资源通常比服务占用更多的内存。通过在单独的进程中承载活动组件,可以保护您的服务不会随着活动一起被杀死。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22174656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档