Java Android:内存/资源泄漏

Java Android:内存/资源泄漏,java,android,eclipse,admob,ddms,Java,Android,Eclipse,Admob,Ddms,我在运行正在开发的android应用程序时出现内存分配错误。这只有在我反复旋转屏幕时才会发生,每次旋转都会导致更多的内存被过滤,直到应用程序崩溃 我有点不愿意发表这篇文章,因为问题本身似乎很容易解决(避免静态上下文引用和静态资源引用,我想),但在过去的10个小时里,我没有运气 我看过一些使用MAT的堆转储文件,但不知道这一切意味着什么,我是第一次使用它 我没有发布任何代码,因为它是部分敏感的,我不确定要发布代码的哪些部分,所以我将在这里给出一个简要的概述 导致问题的活动实例化了一个sound m

我在运行正在开发的android应用程序时出现内存分配错误。这只有在我反复旋转屏幕时才会发生,每次旋转都会导致更多的内存被过滤,直到应用程序崩溃

我有点不愿意发表这篇文章,因为问题本身似乎很容易解决(避免静态上下文引用和静态资源引用,我想),但在过去的10个小时里,我没有运气

我看过一些使用MAT的堆转储文件,但不知道这一切意味着什么,我是第一次使用它

我没有发布任何代码,因为它是部分敏感的,我不确定要发布代码的哪些部分,所以我将在这里给出一个简要的概述

导致问题的活动实例化了一个sound manager类,但该类也在另一个活动中实例化,并且不会在该活动中导致任何问题。用户界面都是用XML创建的,由25个按钮元素组成,这些元素具有相同的9patch背景、3个文本视图和一个教练,其中包含5个图像

MAT显示可疑问题1是android.widget.FrameLayout,可疑问题2是byte[]

任何帮助都将不胜感激,如果需要更多的信息,我将继续编辑并将其包括在内

非常感谢你, 蒂姆

经过更多的尝试和错误(注释出每一段代码并逐段介绍每一部分),我了解到我的问题是由这一行引起的,这与Google AdMob中间广告有关:

interstitual.loadAd(adRequest)

更改以下行解决了问题:

interstival=新的interstitalad(本)


interstitual=新的interstituralad(getApplicationContext())

这个答案不会给你一个明确的解决方案,不是因为我不愿意,而是因为这是不可能的(如果不只是查看代码,而是非常了解代码,甚至更难)。但根据我的经验,我可以告诉你,这些内存泄漏不仅仅是由于直接引用的对象而发生的——你声明的对象(并不断引用其他类/对象)反过来又依赖于许多其他类等等,您可能会看到内存泄漏,这是由于对任何实例的错误处理导致的,这些实例同时引用了其他实例

调试内存泄漏通常是一项非常艰巨的工作,不仅因为正如我上面所说的,它有时并不直接取决于您所声明的内容,而且还因为找到解决方案可能不是一件小事。你能做的最好的事情就是你看起来已经在做的事情:DDMS+HPROF。我不知道你有多少知识,但尽管这不是一个通用的方法,但它帮助我在我的代码中找到内存泄漏

尽管这看起来很简单,但调试这类事情的最佳方法是以渐进方式删除部分代码(总的来说,这些代码意味着使用其他类的实例),并查看HPROF报告如何更改


顺便说一句,请记住,在每次屏幕旋转时,除非专门配置了相反的方法,否则每次都会调用您的
onCreate()
方法,因此我假定在该方法中创建的某些实例在每次屏幕旋转时都不会被释放。

每次旋转时都会调用Activity onCreate,粘贴你的onCreate方法我将首先处理下面发布的@nKn建议。我的onCreate()方法调用了其他几个方法,这些方法会产生大约400行代码,因此这是一个首先整理的好地方。因此,请使用所有init内容创建一个方法,并确保在onCreate上只调用一次。我已将此标记为答案,作为逐步删除部分代码的建议(或者像我一样重新实施它们)找到了问题的原因——谢谢