bea*_*oot 2 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,它不适合我的情况.
如果你没有得到OutOfMemoryError
,改变堆大小不会影响行为.
Dalvik的托管堆抵制增长,试图最小化应用程序的内存占用,并且不幸的是有时会在特定大小上"挂起".通常可以通过分配一个大对象(比如a byte[1000000]
)并立即删除对它的引用来解决这个问题.
FWIW,保证引用被丢弃的最好方法是在一个立即返回的方法中分配它.不要只是删除引用.Dalvik GC不是精确的,因此它不会忽略在寄存器中挥之不去的"死"引用.
(以上所有内容适用于Android 4.4及更早版本.希望将来版本中的情况会有所改善.)