堆转储和内存使用android的差异?

时间:2010-12-30 10:34:47

标签: java android memory heap memory-leaks

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

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

Java.lang.OutOfMemoryError: bitmap size exceeds VM budget

好的 - 我做了我的研究,发现我确实在某个地方有内存泄漏。所以我读到了如何分析这些问题,打开了DDMS并进行了堆转储。堆大小通常大约为4.5-5mb,从不超过60%。这没有任何意义,因为我检查了我的开发手机上运行的服务,它报告我的进程使用35-42mb的内存。

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

2 个答案:

答案 0 :(得分:0)

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

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

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

祝你好运。

答案 1 :(得分:0)

感谢satur9nine,在发布这个之后我实际上做了一些挖掘,最后抓住了发生的事情(当然是在我发布问题之后, go figure )。

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

我骑自行车穿过这些PNG来制作Rain动画。我当时没有意识到这是一个糟糕的策略。一旦我意识到这就是问题,我就废弃了它并写了一个简单的小“粒子系统”来生成一个漂亮的雨动画,只有一个粒子图标加载到内存中!