【问题标题】:Memory from activities not released未释放活动的内存
【发布时间】:2011-06-17 16:44:18
【问题描述】:

我有一个应用程序,它有一些前台活动,还有一个更新一些小部件的服务。 问题是,由于该进程为服务保留,其他活动的内存(如果它们被打开)永远不会回收。

that response from Roman Guy好像可以正常。但它是? android保留未使用活动的资源多长时间?他们可以活几个小时?

如何轻松知道活动是否泄露或简单未回收?我尝试过使用 AndroidMarket (FreeMemoryRecover) 中的程序,它已被清除,但我怀疑它会终止进程然后重新启动服务...

任何帮助或建议将不胜感激。

注意 1:我已经使用 HeapDump + Eclipse MAT 进行了调查,我没有看到奇怪的引用持有我的活动

注2:我已经问过一些关于这个问题的问题:

【问题讨论】:

  • 您是否有任何静态对象/单例包含对使用活动上下文初始化的对象的引用?

标签: android memory-leaks memory-management


【解决方案1】:

Android 在不同状态下拥有多个活动的能力是一项设计原则,因为它允许用户在活动之间快速切换,而无需有意识地关闭他们之前正在做的任何事情。然后他们可以快速返回到之前的活动。

如果 Android 需要暂停 Activity 并快速取消暂停,则需要保持 Activity 的资源可供它使用。

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

你对这段记忆有什么担心?

【讨论】:

  • 我的担忧在 post2 链接中得到了最好的解释,但要简短:如果用户打开一些前台活动,则该进程可以永远保持打开状态,使用量超过 30Mb(包括本机)。我想要确定是否因为 Android 不需要它或者因为我泄漏了某些东西而没有回收来自活动的内存。
【解决方案2】:

我会尝试以下方法:

启动您的应用程序以确保它已完全加载并使用尽可能多的内存。

然后点击主页按钮并启动导航器,打开 techcrunch.com、lemonde.fr、youtube.com、dailymotion.com,从 youtube 启动视频,打开并播放愤怒的小鸟,最后但同样重要的是打开一个pdf文件。

在那之后,Android 肯定需要恢复内存。如果您的应用仍然存在,则可能有问题,如果没有,则一切顺利。

顺便说一句,你很高兴在 AndroidLand 成为一个好公民!

【讨论】:

    【解决方案3】:
    1. 在您的问题下方查看我的评论。

    2. 请参阅Romain Guy's post 了解 Android 内存泄漏。

    3. 具体看Launcher应用中解决方案的评论。 (看unbindDrawables代码here

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

    【讨论】:

    • 我不同意#4。尽可能将活动用作Context。应用程序Context 实际上是一个静态单例。使用Context 可能会导致内存泄漏,如果您使用Context 导致从应用程序Context 到其他对象的链接。但是,Context 活动不是静态单例,因此一旦活动可以被垃圾回收,它可能不再拥有的所有引用都会将其他对象保留在内存中。
    • 顺便说一句,因为我认为 #4 是从您在 #2 中链接到的帖子中呼应 Romain Guy 的 cmets,所以您将他的陈述排除在上下文之外。他表示使用Application“如果您打算保留需要上下文的长寿命对象”,而不是作为一般策略。
    • 您在#3 中的链接已失效
    猜你喜欢
    • 2016-10-19
    • 2019-09-04
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多