【问题标题】:Heap dumps and memory use discrepancies in android?android中的堆转储和内存使用差异?
【发布时间】:2011-06-01 12:06:36
【问题描述】:

好吧,我通常不会寻求帮助,因为我通常更喜欢自己寻找答案,但不幸的是我似乎无法做到这一点。

我正在搞乱 android 2.1+ 的动态壁纸事情进展顺利,直到我开始遇到 OOM 错误:

Java.lang.OutOfMemoryError: bitmap size exceeds VM budget

好的 - 我进行了研究,发现我肯定在某个地方存在内存泄漏。因此,我阅读了如何分析此类问题,打开了 DDMS 并进行了堆转储。堆大小通常在 4.5-5mb 左右,并且永远不会超过 60%。这没有任何意义,因为我检查了我的开发手机上正在运行的服务,它报告我的进程使用了​​ 35-42mb 的内存。

我不是要求任何人找到我的泄漏,因为这需要大量代码等。只是为了解释如何正确分析我的内存使用情况,因为我似乎对发生的事情完全目瞪口呆。

【问题讨论】:

    标签: java android memory memory-leaks heap-memory


    【解决方案1】:

    我猜你已经这样做了,但以防万一……你检查了触发 OutOfMemoryError 的行吗?您要创建的位图有多大?

    如果是泄漏,这里有一篇文章可以帮助您分析堆转储(尽管文章标题您不必使用 eclipse):

    Android ==> Memory Analysing ==> Eclipse memory analyzer?

    祝你好运。

    【讨论】:

      【解决方案2】:

      感谢 satur9nine,实际上我在发布此内容后进行了更多挖掘,最终了解了发生的情况(当然那是在我发布问题之后,上图)。

      我发现android的服务管理器中报告的内存使用情况被称为Native Heap。这是堆大小 + 位图(可能还有其他东西?)。但是我仍然有点困惑,为什么有时它是 40+ MB,而我正在加载的图像只有 ~ 900 KB。当它单击时,图像在加载到内存时不再保持压缩状态。 所以我加载大约 30 个小 PNG 会占用大量内存。

      我正在循环浏览这些 PNG 来制作 Rain 动画。我当时并没有意识到这是一个糟糕的策略。一旦我意识到这是问题所在,我就放弃了它并自己编写了一个简单的小“粒子系统”来生成一个漂亮的下雨动画,只需将一个粒子图标加载到内存中!

      【讨论】:

      • 很高兴您解决了问题。我并不惊讶这不是真正的泄漏。通常你必须努力在 Java 中泄漏内存。
      猜你喜欢
      • 2017-05-19
      • 2019-02-02
      • 1970-01-01
      • 2011-11-28
      • 2014-06-02
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多