Android增长堆 - 我应该担心吗?

时间:2013-03-29 13:11:17

标签: java android heap-memory

我已经阅读了一些关于具有16MB内存“预留”的应用程序的内容。 至少,作为开发人员,我应该依赖于此,即使依赖于设备它可能更多。

我支持低至2.2 froyo,因此很多设备都不会是高端设备。 我在Logcat中收到一些消息说:

03-29 14:08:51.570: I/dalvikvm-heap(19899): Grow heap (frag case) to 13.624MB for 200765-byte allocation

令我担心的是13MB。我不知道如果我的应用程序达到16MB可能会崩溃。我应该认真考虑优化一些代码吗?

2 个答案:

答案 0 :(得分:5)

Android内存管理并不是那么简单,在内存使用方面你应该始终保持尽可能低。

每个Android设备的可用内存有限。在大多数情况下,它与屏幕尺寸,CPU计算能力和其他一些相关(如3D屏幕在某些情况下需要两倍的内存)。 Nexus One拥有32MB,Galaxy Nexus - 64MB,平板电脑可以拥有更多。可以在系统设置中更改最大堆大小。 Cyanogen Mod可以轻松调整。

较旧的机器人(2.3?之前)将此内存限制分为两部分 - 标准(普通对象,UI,字符串等)和多媒体(图像,音频缓冲区,OpenGL内容,相机框架)。带有Android 2.2的Nexus One有16MB / 16MB堆,有时会非常恼人,因为你可以加载16MB的图像和100KB的UI来破坏显示简单图库的应用程序。

某些设备不允许您分配太大的内存块。例如,Galaxy Nexus的限制为31.9999MB。此外,您尝试分配的更大的连续内存块,系统需要更多时间来完成此类分配。它必须重新分配一些东西来找到这么大的内存块。

较新的机器人拥有largeHeap标志,这给了很多记忆。通常比通常大约多5倍。虽然听起来不错,但建议不要使用largeHeap(调试除外)因为它可能导致内存使用严重问题。基本上系统本身需要一些内存。如果您采取的操作超过预期,Android将从最近最少使用的应用程序开始,不加任何通知地终止您的应用程序。

垃圾收集器可能有不同的策略,具体取决于系统版本和实现。股票Android 2.3(我猜)在Nexus One上非常激进,我们无法分配超过13MB的图像。它可能看起来像你有很多内存,并突然繁荣 - 你的应用程序已关闭。

您可以使用本机内存。每个Android应用程序(或多或少)都是一个linux进程,它可以使用直接malloc调用为自己分配内存。您需要JNI和C代码,但使用它可以访问整个内存并执行您想要的任何操作。再次,请注意,当可用内存量变得太低时,系统会终止您的应用程序。

您可以使用多个流程拆分您的应用,并在它们之间分配memoty用法。它不是那么方便,但是它有效并且一些图书馆使用它来获得比初看起来更多的资源。

除此之外,您必须记住某些对象可能会使用比您想象的更多的内存。例如,硬件加速有点棘手。大多数设备不支持非二次幂的纹理。这意味着当您启用ImageView(300x50px)并启用硬件加速时,Android将为您为ImageView分配512x64px纹理。它必须,因为一切都是由OpenGL绘制的,它需要纹理。使用这样的纹理,ImageView所需的内存比没有硬件加速时的内存大2.5倍。此外,如果您的视图是动画的,Android必须在每个动画帧中重建纹理。

总结一下 - 在内存管理方面,Android可能很棘手。堆积增长到更大的值可能没有错,因为有时您需要更大量的内存(例如,在创建图库时)。您应该知道有很多不同的因素可能会影响您的应用内存使用情况,并尽量保持尽可能低。

答案 1 :(得分:0)

如果你真的每次都得到相同的错误,那么最好的方法是增加堆大小。 并且增加堆大小非常简单。

它不会影响您的其他服务。增加eclipse存储的.ini文件中的堆大小。