gpt4 book ai didi

java - Android:内存/资源泄漏

转载 作者:行者123 更新时间:2023-12-01 12:35:47 25 4
gpt4 key购买 nike

我在运行我正在开发的 Android 应用程序时遇到内存分配错误。仅当我反复旋转屏幕时才会发生这种情况,每次旋转都会导致释放更多内存,直到应用程序崩溃。

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

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

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

导致问题的 Activity 实例化了一个声音管理器类,但该类也在另一个 Activity 中实例化,并且不会导致任何问题。 UI 全部用 XML 创建,由 25 个具有相同 9patch 背景的 Button 元素、3 TextViews 和一个 Coach 组成。内有 5 张图片

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

任何帮助将非常感激,如果需要更多信息,我将继续编辑以包含它。

非常感谢,蒂姆。

经过更多的尝试和错误(注释掉每一点代码并一点一点地介绍每个部分),我了解到我的问题是由这一行引起的,它与 Google AdMob 插页式广告有关:

interstitial.loadAd(adRequest);

更改以下行解决了问题:

interstitial = new InterstitialAd(this);

interstitial = new InterstitialAd(getApplicationContext());

最佳答案

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

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

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

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

关于java - Android:内存/资源泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25610400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com