Android 关于dalvik初始治疗

Android 关于dalvik初始治疗,android,memory-management,dalvik,heap-size,Android,Memory Management,Dalvik,Heap Size,我目前正在开发一个android应用程序,我正在使用自己的设备(Nexus4)进行调试。关于Dalvik VM分配的堆大小,我似乎有一些问题,希望您能在这方面帮助我 我的应用程序正在处理一个文件中相对重要的数据量(~3MB),并使用它生成总共大约10MB的java对象。对于具有2GB RAM和512MB堆大小限制的设备来说,这应该不是问题(如果我没有弄错的话) 然而,调试工具告诉我,分配给我的应用程序的堆大小大约为10MB,这导致了大量的垃圾收集(每个GC释放约500KB)。我已经浏览了SO和其

我目前正在开发一个android应用程序,我正在使用自己的设备(Nexus4)进行调试。关于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的托管堆抵制增长,试图最小化应用程序的内存占用,不幸的是,有时会在特定大小上“挂起”。通常可以通过分配一个大对象(比如,一个
字节[1000000]
)并立即删除对它的引用来绕过这个问题

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


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

您好,首先,感谢您的回答。欺骗虚拟机的想法很好。这不是一个干净的解决方案,但仍然是一个备份计划。我的问题实际上更多地是关于数字的移植。我的应用程序使用的数据比普通应用程序多,但它只分配了10MB,这与其他应用程序获得的数据(64MB+)相比似乎非常低。您的应用程序可以访问与其他应用程序相同的数据量。虚拟机只是尽力不使用它。理想情况下,虚拟机会看到它频繁地进行GCing并扩展堆,而不是继续坚持保持堆小,但它目前没有做到这一点。“菲亚特勒克斯”:)非常感谢您的解释,一切都一下子变得清晰了!