我们的应用程序使用了很多位图。它适用于例如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:24 mb,Xoom 48 mb)。在我看来,系统应该至少提供16 MB,但我们有12 MB的OOM。我的问题是:如何找出Android 2的位图有多少可用堆大小?*?或者请建议如何以其他方式避免此类问题。仅供参考我们不能使用较少的位图,尤其是当它在其他设备上正常工作时。在此先感谢您的帮助!
答案 0 :(得分:2)
你可以尝试
Runtime.getRuntime().maxMemory();
或活动的方法
getMemoryInfo(ActivityManager.MemoryInfo;
此外,您可以覆盖活动的
onLowMemory();
方法,在关闭之前,您可以处理在活动获得内存问题通知时会发生的情况。您还应该从Android / Linux内存上的Android开发工具中查看此answer。
答案 1 :(得分:0)
此OutOfMemory异常来自内存泄漏,而不是来自文件本身。您是否重写了onStop,onResume,onDestroy等活动生命周期方法?