当活动被杀死时,堆大小如何增加?

3

我不知道之前是否有人提过这个问题,但我想了解事情的运作方式。

我有两个活动*Test_Activity*和*Second_Activity*。Test_Activity有一个按钮调用Second_Activity(使用 Intent ),在我的Second_Activity中我有一个按钮返回到第一个(使用 Intent )。我尝试从测试中调用第二个,然后再从第二个回到测试。我尝试了大约10次(此期间未杀死活动),当我更新时,发现我的堆大小从 3.027Mb-4.002Mb 增加。

之后,我在调用其他活动时添加了* finish()* 的代码,并重复了另外10次相同的过程。我发现堆大小仍在增加。怎么会这样..?? 当活动被杀死时,它不是从内存中删除吗...?? 如果堆大小一直像这样增加,那么当它达到最大限制时,我的应用程序不会被杀死吗....?? Android应用程序的最大堆大小是多少...??

我还想澄清的另一件事是,为什么只有2个活动(如上所述)且没有太多资源的应用程序会消耗3.027Mb的堆大小? 我没有添加任何可绘制物品或任何东西。


你的 Test_Activity 是否设置了 android:launchMode="singleTop" - Apoorv
@Apoorv 不是,但我会尝试一下。 - suja
@Apoorv 当android:launchMode="singleTop"时,它是否真的会增加/减少堆大小? - N Sharma
我尝试使用launchMode="singleTop",在注释掉finish()之后,初始堆大小约为3.008,在进行10次试验后达到了5.00。 - suja
1个回答

4
这种增长(3到4MB)是完全无关紧要的。如果需要,Android可以实例化并保留一些资源。如果您真的关心内存消耗,应该使用MAT进行内存剖析。这里有一篇非常技术性的文章介绍了内存管理。如果您觉得程序中存在一些内存泄漏(活动卡在某个地方,您不知道在哪里和如何解决),这里有一个Google IO视频演示可以帮助您跟踪它。
此后,我将*onFinish()*添加到代码中。Android没有调用名为onFinish的回调方法。
一个应用程序使用的总堆大小并没有标准化。我曾经看到同一款应用在索尼手机上使用4到6 MB,在三星手机上却需要15到20 MB。而且这是一个非常简单的应用程序...这完全取决于制造商。只要你不泄漏大量内存块或者不使用比实际需要更大的资源,你就不用担心这些不同的内存使用情况。

+1 但为什么根据供应商而异?为什么开发人员不担心这个问题?如果它持续增加很长时间,那么应用程序将崩溃并出现OutOfMemory。 - N Sharma
我不确定为什么会出现这些不同的内存大小。当你使用比应该更大的资源或者泄漏了一些大的东西时,才会发生OutOfMemory。只要你做得正确,你就不需要担心这些增长,因为设备知道如何回收所需的内存。 - gunar
是的,我同意,但正如OP所说,即使OP没有使用更大的资源,内存仍然非常快地增长。 - N Sharma
@gunar 不是 onFinish(),我的意思是 finish(),对不起我在帖子中已经更正了。 - suja
@suja:正如答案中所说,这是无关紧要的。你可能会发现在其他设备类型上,这种增长并不明显,而对于另一些设备来说,它甚至更加明显。 - gunar
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接