我目前正在开发一个 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,它不适合我的情况。
最佳答案
如果您没有遇到 OutOfMemoryError
,则更改堆大小不会影响行为。
Dalvik 的托管堆会阻止增长,以尽量减少应用程序的内存占用,但不幸的是,有时会“挂起”特定大小。通常可以通过分配一个大对象(例如 byte[1000000]
)并立即删除对其的引用来解决这个问题。
FWIW,保证引用被删除的最佳方法是在立即返回的方法中分配它。不要只是取消引用。 Dalvik GC 不是实时精确的,因此它不会忽略寄存器中徘徊的“死”引用。
(以上所有内容均适用于 Android 4.4 及更早版本。希望 future 版本中情况会有所改善。)
关于android - 关于 dalvik 初始堆大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19724002/