在dalvik初始堆积

时间:2013-11-01 09:26:49

标签: android memory-management dalvik heap-size

我目前正在开发一个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,这在我的情况下是不合适的。

1 个答案:

答案 0 :(得分:5)

如果你没有得到OutOfMemoryError,改变堆大小不会影响行为。

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

FWIW,保证引用被丢弃的最佳方法是在一个立即返回的方法中分配它。不要只是删除引用。 Dalvik GC不是精确的,因此它不会忽略在寄存器中挥之不去的“死”参考。

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