我目前正在开发一个android应用程序,我正在使用自己的设备(连接4)来调试它。对于Dalvik分配的堆大小,我似乎遇到了麻烦,我希望您能在这个问题上帮助我。
我的应用程序正在处理一个文件中相对重要的数据量(~3MB),并使用它生成总计约10 My的java对象。对于一个拥有2GB内存和512 of的堆大小限制的设备来说,这不应该是一个问题(如果我没有弄错的话)。
但是,调试工具告诉我,分配给我的应用程序的堆大小大约是10 me,导致了大量的垃圾收集(每个GC释放了500 GC)。我已经在SO和其他关于Dalvik堆大小模型的论坛上浏览了很多页面,在这个例子中我找到了largeHeap="true" (API级13+)属性,但是它并没有改进任何东西,当设备的初始内存为2GB时,我仍然需要使用10 2GB。我知道操作系统等占用了一些内存,Dalvik也在限制应用程序,但是为什么我不能至少达到512 OS呢?
我有误解什么吗?我错过了什么吗?问题似乎很简单,但我不明白。
我们将非常感谢您的帮助!
PS:请不要建议改用NDK,这对我来说不合适。
发布于 2013-11-01 14:33:05
如果您没有得到OutOfMemoryError,那么改变堆大小不会影响行为。
Dalvik的托管堆抵制增长,以尽量减少应用程序的内存占用,不幸的是,有时会在特定的大小上“挂起”。通常可以通过分配一个大对象(例如byte[1000000])并立即删除对它的引用来解决这个问题。
FWIW,确保删除引用的最佳方法是将其分配到一个立即返回的方法中。不要仅仅取消引用。Dalvik GC并不是实时精确的,因此它不会忽略寄存器中挥之不去的“死”引用。
(以上所有内容都适用于Android4.4和更早版本。希望这种情况在将来的发行版中得到改善。)
https://stackoverflow.com/questions/19724002
复制相似问题