8

我们的应用程序使用了很多位图。例如,它在 G1、XOOM 上运行良好。但在 HTC Desire 上出现 OutOfMemory 错误。在代码中,我们使用 try/catch(OutOfMemoryError e) 并且所有设备(Desire 除外)都会抛出异常,但 HTC 只是在没有 OOM 异常的情况下终止应用程序。我们将位图的内存限制为 12 Mb,看来此解决方案解决了问题,但客户在 HTC Desire HD 上仍然存在问题。即使有 12 Mb 的限制,也会有 OOM。以下是日志:

06-07 12:03:43.978 E/dalvikvm-heap( 29616):1140128-byte external allocation too large for this process. 
06-07 12:03:43.978 E/dalvikvm( 29616):Out of memory: Heap Size=12311KB, Allocated=9420KB, Bitmap Size=12139KB, Limit=21884KB
06-07 12:03:43.978 E/dalvikvm( 29616):Trim info: Footprint=15751KB, Allowed Footprint=15751KB, Trimmed=3440KB
06-07 12:03:43.978 E/GraphicsJNI( 29616):VM won't let us allocate 1140128 bytes

AFAIK 对设备有不同的堆大小限制(G1:16mb,Droid:24mb,Xoom 48mb)。在我看来,系统应该至少提供 16 mb,但我们有 12mb 的 OOM。我的问题是:如何找出可用于 Android 2.* 位图的可用堆大小?或者请建议如何以其他方式避免此类问题。仅供参考,我们不能使用更少的位图,尤其是当它在其他设备上运行良好时。提前感谢您的帮助!

4

2 回答 2

2

你可以试试

Runtime.getRuntime().maxMemory();

或 Activity 的方法

getMemoryInfo(ActivityManager.MemoryInfo;

此外,您可以覆盖 Activity 的

onLowMemory();

方法,您可以在其中处理 Activity 在被关闭之前收到内存问题通知时会发生的情况。您还应该从 Android/Linux 内存上的 Android 开发人员那里查看这个答案。

于 2011-06-07T20:00:04.947 回答
0

此 OutOfMemory 异常来自内存泄漏,而不是来自文件本身。您是否覆盖了活动生命周期方法,如 onStop、onResume、onDestroy?

于 2012-06-22T17:37:50.537 回答