活动占用的内存未被释放

3
我有一个应用程序,其中包含一些前台活动和更新一些小部件的服务。问题在于,当进程保留服务时,如果已经打开了其他活动,则从这些活动中释放的内存永远不会被回收。
根据Roman Guy的回复,似乎这是正常现象。但是,Android会保留未使用活动的资源多长时间?它们可以存活数小时吗?
如何轻松知道活动是否泄漏或者只是没有被回收?我已经尝试过AndroidMarket上的一个程序(FreeMemoryRecover),它已被清除,但我怀疑它会杀死进程,然后重新启动服务...
任何帮助或建议都将不胜感激。
注1:我已经使用HeapDump + Eclipse MAT进行了调查,但我没有看到任何奇怪的引用持有我的活动。
注2:我已经问了一些关于这个问题的问题:

你是否有任何静态对象/单例对象,它们持有使用活动上下文初始化的对象的引用? - Lior
3个回答

1

Android具有多个处于不同状态的Activity的能力,这是一种设计原则,因为它允许用户在不需要有意识地关闭之前正在进行的操作的情况下快速切换活动。他们可以随后快速返回到以前的活动。

如果Android需要暂停一个Activity,并快速取消暂停,它将需要保持Activity的资源可用。

如果内存是终止的Activity的一部分,则会泄漏(这很不可能,因为Linux内核将回收进程终止时使用的所有内存),否则它要么正在被积极使用,要么可能即将被使用。

您对此内存有什么疑虑?


我的问题最好在post2链接中解释,但简而言之:如果用户打开一些前台活动,则该进程可以保持打开状态,使用超过30Mb(包括本机)。我想要的是确保活动中的内存没有被回收,因为Android不需要它还是因为我泄漏了什么东西。 - lujop

1
我会尝试以下步骤:
启动您的应用程序并使用尽可能多的内存,确保它已完全加载。
然后按Home键并启动浏览器,打开techcrunch.com、lemonde.fr、youtube.com和dailymotion.com,从YouTube上播放一个视频,打开并玩愤怒的小鸟,最后打开一个PDF文档。
之后,Android肯定需要回收内存。如果您的应用程序仍然存在,则可能存在问题;如果不存在,则一切顺利。
顺便说一句,您非常关心成为AndroidLand中的良好公民!

0
  1. 请看我在你问题下面的评论。

  2. 请看Romain Guy的帖子,了解有关Android内存泄漏的信息。

  3. 具体来说,请查看Launcher应用程序中解决方案的评论。 (在此处查看unbindDrawables代码here

  4. 尽可能使用Context.getApplicationContext()而不是您的活动上下文。


我不同意第4点。尽可能使用活动作为“Context”。应用程序的“Context”实际上是一个静态单例。如果您使用该“Context”会导致从应用程序“Context”到其他对象的链接,那么可能会导致内存泄漏。然而,活动“Context”不是静态单例,因此一旦活动可以进行垃圾回收,它可能具有的所有引用将不再保留其他对象的内存。 - CommonsWare
1
顺便提一下,我假设#4是在回应你在#2中链接到的Romain Guy的评论,你把他的陈述从上下文中割裂了。他指出,如果您计划保留需要上下文的长期对象,则使用“Application”,而不是作为一般策略。 - CommonsWare
你在第三个链接的连接已经失效。 - stevebot

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