我目前正在开发一个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,这在我的情况下是不合适的。
答案 0 :(得分:5)
如果你没有得到OutOfMemoryError
,改变堆大小不会影响行为。
Dalvik的托管堆阻止增长,试图最小化应用程序的内存占用,不幸的是有时会在特定大小上“挂起”。通常可以通过分配一个大对象(例如,byte[1000000]
)并立即删除对它的引用来解决这个问题。
FWIW,保证引用被丢弃的最佳方法是在一个立即返回的方法中分配它。不要只是删除引用。 Dalvik GC不是精确的,因此它不会忽略在寄存器中挥之不去的“死”参考。
(以上所有内容适用于Android 4.4及更早版本。希望未来版本的情况会有所改善。)