2

我目前正在开发一个 android 应用程序,我正在使用我自己的设备(nexus 4)来调试它。我似乎对 Dalvik VM 分配的堆大小有疑问,希望您能在这方面帮助我。

我的应用程序正在处理文件中相对重要的数据量(~3MB),并使用它来生成总共大约 10MB 的 java 对象。对于具有 2GB RAM 和 512MB 堆大小限制的设备(如果我没记错的话),这应该不是问题。

然而,调试工具告诉我分配给我的应用程序的堆大小大约为 10MB,导致垃圾收集的数量惊人(每个 GC 释放约 500KB)。我已经在 SO 和其他论坛上浏览了很多关于 Dalvik 堆大小模型等的页面,我发现largeHeap="true"在这种情况下使用(API 级别 13+)属性,但是,它没有任何改进,我仍然坚持当设备的初始内存为 2GB 时使用 10MB。我知道操作系统等会占用一些内存,Dalvik 也限制了应用程序,但为什么我不能达到至少 512MB?

那么,我是不是误会了什么?我错过了什么?这个问题看起来很简单,但我不明白。

对你的帮助表示感谢!

PS:请不要建议切换到NDK,它不适合我的情况。

4

1 回答 1

5

如果您没有得到OutOfMemoryError,则更改堆大小不会影响行为。

Dalvik 的托管堆会阻止增长,以尽量减少应用程序的内存占用,不幸的是有时会在特定大小上“挂起”。通常可以通过分配一个大对象(例如 a byte[1000000])并立即删除对它的引用来解决这个问题。

FWIW,保证引用被删除的最好方法是在一个立即返回的方法中分配它。不要只是取消引用。Dalvik GC 不是实时精确的,因此它不会忽略在寄存器中徘徊的“死”引用。

(以上所有内容均适用于 Android 4.4 及更早版本。希望在未来的版本中情况会有所改善。)

于 2013-11-01T14:33:05.693 回答