Android:内存/资源泄漏

时间:2014-09-01 17:08:53

标签: java android eclipse admob ddms

运行我正在开发的Android应用时,我有一个内存分配错误。这种情况只有在我重复旋转屏幕时才会发生,每次旋转会导致更多的内存被泄漏,直到应用程序崩溃。

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

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

我还没有发布任何代码,因为它部分敏感,而且我不确定要发布的代码部分,所以我将在此简要介绍一下。

导致问题的活动实例化一个声音管理器类,但是这个类也在另一个活动中实例化,并且没有问题。 用户界面全部用XML创建,包含25个按钮元素,具有相同的9个补丁背景, 3 TextViews 教练 5张图片

MAT说可疑问题1是android.widget。 FrameLayout 并且怀疑问题2是byte []

任何帮助都会被疯狂地欣赏,如果需要更多信息,我们将继续编辑以包含它。

非常感谢, 添

经过一些试验和错误(评论出每一段代码并一点一点地介绍每个部分)后,我了解到我的问题是由此行导致的,该行与Google AdMob插页式广告有关:

interstitial.loadAd(adRequest);

更改以下行解决了问题:

interstitial = new InterstitialAd(this);

interstitial = new InterstitialAd(getApplicationContext());

1 个答案:

答案 0 :(得分:1)

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

调试内存泄漏通常是一项非常艰苦的工作,不仅仅是因为正如我上面所述,它有时并不直接依赖于您声明的内容,而且因为找到解决方案可能并非易事。您可以做的最好的事情就是您似乎正在做的事情:DDMS + HPROF。我不知道你有多少知识,但是虽然它不是一种通用的方法,this link帮助我找到了代码中的内存泄漏。

虽然看起来微不足道,但调试这类事情的最佳方法是逐步删除代码的一部分(总体而言,意味着使用其他类的实例)并查看HPROF报告的更改方式。

顺便提一下,请记住,在每个屏幕旋转时,除非特别配置相反,否则每次都会调用onCreate()方法,所以我假设在该方法中创建了一些未被释放的实例每个屏幕旋转。