android - 关于 dalvik 初始堆大小

标签 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 的托管堆会阻止增长,以尽量减少应用程序的内存占用,但不幸的是,有时会“挂起”特定大小。通常可以通过分配一个大对象(例如 byte[1000000])并立即删除对其的引用来解决这个问题。

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

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

关于android - 关于 dalvik 初始堆大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19724002/

相关文章:

android - 重写 View.layout(...) 时出现 VirtualMachineError

java - 转换为 Dalvik 格式失败,错误 1 ​​- 重复,但无法解析

android - 首选项屏幕中的文本大小问题

android - 尝试使用 Room 库时出错。 [SQLITE_ERROR] SQL 错误或缺少数据库

android - 在 Android 中使用布局权重属性动态添加 View

android - 当我点击 TextView 时调用一个短号码

android - 从内核模块中查找异常向量表的物理地址

c++ - 我应该在堆上创建一个新的 QDomDocument 吗?

c++ - 为我的 AI 算法设置内存限制?

java - RegisterNatives 失败,原因为 'android/webkit/BrowserFrame'