android - 分配跟踪器或堆分析器可以帮助跟踪 'bitmap size exceeds VM budget' 错误吗?

标签 android memory-management memory-leaks bitmap android-canvas

我在追踪“位图大小超出 VM 预算”错误时遇到了很大的问题。我查看了其他问题,并尝试了所有建议(取消分配资源,使用 bitmap.recycle() 并将变量、位图、 Canvas 设置为空,当 Activity 被破坏或 View 从窗口分离时 https://stackoverflow.com/a/6779448/571143 ,还试图摆脱 ' this' 上下文并使用了 this.getAplicationContext())。

我遇到的问题不是位图太大而无法加载。一开始一切都加载正常,但在多次重复更改当前 Activity 后,我收到此错误(在设备上发生的 Activity 更改比在模拟器上多得多)。

所以,回到我的问题,有没有办法使用分配跟踪器或堆分析器来指导我朝着正确的方向前进?这些工具中没有“位图分配”的痕迹,只有小的(大部分小于 1kb)分配。我已经读过这个:http://android-developers.blogspot.com/2009/02/track-memory-allocations.html

我知道我做错了什么,因为位图没有释放,但我正在做的项目非常大,由一群人完成,所以手工分析一切都是最后的选择,也非常耗时。

在这种情况下,如果能提供有关这些工具的任何提示,我将不胜感激。

干杯, 卡吉曼

最佳答案

你已经发现它是某种内存泄漏。如果您还没有这样做,请确保您不只是在缓存中累积位图而不清除它。其他可能(且更微妙)的问题包括具有引用 Activity 或上下文的长时间运行的任务,或使用长时间运行的任务或单例注册监听器的 Activity 。

您可以使用 Eclipse 内存分析器 http://www.eclipse.org/mat/工具来追踪持有哪些类型的引用资料。它在 2.x 手机上有点棘手,因为位图是在 native 内存中分配的,不会显示在您的 VM 堆转储中。您仍然会看到位图,但它们不会以实际占用的大小列出。您可以通过尝试比较首次打开应用程序时与开始大量新 Activity 后的位图对象数来解决此问题。

有关调试这些问题和使用相关工具的精彩演讲,请参阅 google IO 演讲:http://www.youtube.com/watch?feature=player_embedded&v=_CruQY55HOk

关于android - 分配跟踪器或堆分析器可以帮助跟踪 'bitmap size exceeds VM budget' 错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9891545/

相关文章:

android - Renderscript 未使用构建工具 25.0.0+ 进行编译

java - 在android上安装Java库[GIThub源代码]

iphone - 如何创建本地自动释放池以节省内存?

python - 用于遍历 NumPy 数组的惰性求值

java - 如果我将一个重物体作为参数传递给某个函数,成本是多少

android - Android 应用通过 post 发送的参数在 Go 语言编写的后端服务器上始终为空

java - Android 图像背景带圆角

java - View 的一个实例上的内存泄漏

c - valgrind 即使在内存释放后也显示内存泄漏

c++ - 如果我不使用 new 关键字,我会发生内存泄漏吗?