【问题标题】:Memory allocated but not deallocated when called finish() in android在android中调用finish()时分配但未释放的内存
【发布时间】:2016-03-24 07:49:02
【问题描述】:

我有一个应用程序,但我遇到了性能问题。应用程序崩溃很多。我试图监控我的 android studio 中的内存分配部分,我发现了我的应用程序崩溃如此多的原因。我的应用程序从 19MB 开始。我经历了不同的活动,然后在我正在调用finish() 的应用程序中按下返回按钮。我意识到内存已分配给我的应用程序,但即使在调用完成后也没有释放内存。我显然犯了一些大错,但有人可以列出一些可能发生这种情况的原因。我会很感激的。哦,是的,我的应用程序达到了 72 MB。内存从未被释放。

【问题讨论】:

    标签: android performance memory


    【解决方案1】:

    你检查内存泄漏了吗? Android 会杀死process,但components 分配的内存可能不会被GC 释放。这可能是由于持有组件或其成员的引用而发生的。

    请注意:Android 总是会杀死进程而不是组件。我们的工作是确保它们被垃圾收集(是的,GC 自己做,但如果我们持有对任何组件的引用,它不会被垃圾收集)。

    编辑1:您可以调查与详细here相同的内容。或者你可以使用这个很棒的library by square

    编辑 2:例如,您在 async task 中持有的 view 引用,这样您就可以在 task 完成时更新它。但是当task 仍在运行时,activity 由于屏幕旋转而被破坏。在这里,android 将杀死 foreground process,但 GC 将无法收集分配的内存,因为 async task 持有 view 的引用,因此活动也不会被收集,因为 view 已绑定到它的activity。然后该活动的所有成员也不会被收集。

    【讨论】:

    • 是的,显然这是唯一的解释,但我如何检查泄漏?
    • GC不会自己调用吗?你的意思是我必须自己打电话给 GC?
    • 是的,GC 会自己调用。但是,如果您持有对任何组件的引用,它将不会收集它。这就是内存泄漏的原因。
    • 谢谢,我会检查一下,如果它有助于我解决问题,我会接受答案:)
    • 还有一个问题。你能给我一个小例子,一个组件是如何分配内存但没有释放的?我不太擅长理解内存问题。
    【解决方案2】:

    好吧,我试着看看我是否犯了任何错误,但遗憾的是找不到,但我在调用完成后尝试了这个,它释放了很多空间。

    Runtime.getRuntime().gc();
    

    但我认为 gc 是自动调用的,所以如果我错了,有人可以告诉我自己调用 gc 是否有任何危险,如果没有,那么这条线对我有用:)

    【讨论】:

      猜你喜欢
      • 2011-12-27
      • 2016-01-24
      • 2012-08-24
      • 1970-01-01
      • 2014-11-14
      • 2011-08-30
      • 2020-05-21
      • 2011-12-09
      • 1970-01-01
      相关资源
      最近更新 更多