java - 我的Android程序有内存泄漏吗?

标签 java android memory-leaks

我知道如果没有实际代码,这似乎无法确定,但请耐心等待。我认为从症状上可以判断出一些东西。

我有一个层次结构浏览器,其中层次结构的每个级别都由其自己的 Activity 显示。如果您检查层次结构的太多分支,它将引发 OutOfMemoryError 异常。这听起来像是内存泄漏,但随意查看代码并没有发现任何明显的信息,因此在进行更彻底的调查之前,我希望对 Java 和 Android 的某些方面进行一些澄清。

首先,我可以在抛出 OutOfMemoryError 之前依赖未使用的 Activity 进行垃圾收集吗?如果不是这种情况,我会认为这是奇怪的行为,但它可以解释我遇到的一切。

其次,Dalvik垃圾收集器可以收集循环引用吗?我认为我没有,但如果没有,我会知道在我的代码中查找。

我知道有办法在 Android 应用程序中通过创建对程序生命周期内的事物的引用来泄漏内存,但我再次认为我没有这样做。例如,我没有以编程方式创建任何 UI 控件,也没有将当前 Activity 作为 Context 传递给任何内容。

最后,我最近从未注意到这个错误,自首次创建以来唯一发生的变化是 Android 版本从某种口味 Jelly Bean 升级到 KitKat.

任何帮助将不胜感激。谢谢!

最佳答案

First, can I rely on unused activities to be garbage collected before OutOfMemoryError is thrown?

尽管人们普遍认为,答案是否定的。您可以用 Activity 填充内存,直至引发错误,而 Android 也不会destroy any activities GC 期间也不收集这些 Activity 。

系统有一个选项可以完成后台堆栈中的 Activity ,但它在 2011 年被禁用。现在,如果系统内存不足,Android 将终止整个进程。前台应用程序很可能会达到每个应用程序的堆限制,因为系统会避免杀死它,并且可能有足够的可用内存供其他应用程序使用。

为什么 Activity 没有被 GC 处理?所有正在运行的 Activity 都存储在 ActivityThread 类中(该类执行与系统的所有交互并处理 Activity 的生命周期事件),因此它们不符合垃圾回收的条件。它们只有在被摧毁后才会从这里移走。

Secondly, can the Dalvik garbage collector collect circular references?

是的,它可以,就像常规 JVM 的垃圾收集器一样。否则它将不兼容 Java。

您可以通过使用Memory Analyzer tool and other techniques来检查所有内存的去向。 。这些工具可以向您显示堆上有哪些对象以及阻止它们被收集的原因。

我建议您使用Fragments在单个 Activity 而不是多个 Activity 中。 fragment 具有回调,可用于在 fragment 离开屏幕(返回堆栈)时释放 View 层次结构。

关于java - 我的Android程序有内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20807499/

相关文章:

java - 命名空间 "classloader-namespace"无法访问库

java - 插件太多会降低 Eclipse 的速度吗?

java - 从API获取Android系统上次关闭时间

android - 为什么暂停不适用于 LiveData?

android - 如何解决 android api 30+ 中的 "Missing PendingIntent mutability flag"lint 警告?

java - session 和事务的线程使用导致内存泄漏?

java - 关闭 Java EE 应用程序时内存泄漏未卸载单例

java - XML 错误 : "Too many descriptors open"

java - 使用类和接口(interface)的代码

c - fork() 导致内存泄漏