hashmap 会占用多少空间?
这是一个实现细节,可能因版本、设备等而异。只要我们理解这一点并仅寻找估计,您实际上可以非常轻松地测量它。Android SDK 包含一套功能强大的内存分析工具。查看 Eclipse MAT(我眼中最好的)。您可以在哈希图完全加载时拍摄堆快照,然后使用 MAT 查看它需要多少字节。确保你总结了哈希本身、键和值(如果我没记错的话,MAT 也可以为你做数学(它可以很好地处理核心集合)。
dalvik能分配吗?
为了便于讨论,假设您的 hashmap 占用 1MB 内存。要了解这是否太多,我们需要了解我们所居住的系统的约束。Dalvik 限制了堆的最大大小。限制因设备而异。非常旧的设备上的最小值是 16MB。三星 Galaxy 2 等设备的容量约为 32MB-48MB,而 Galaxy 3 和 4 等新设备的容量则超过 100MB。
应用程序中最大的内存消耗通常是位图。由于每个像素可能占用多达 4 个字节,因此全屏位图可以轻松占用几 MB 内存。
考虑到这一点,1MB 的收费听起来还不错。这相当于使用漂亮的背景图像 :) 如果您的整体内存使用率很低,您可以按照您认为合适的方式分发它。内存分析工具(MAT 或 DDMS)可让您准确了解应用程序当前使用的内存量,因此您可以轻松估算总消耗量。
其他想法:
将事物缓存在内存中以提高性能通常是一个好主意。所以你的方法在我看来是一个很好的方法(只要你理解记忆的含义)。
由于您的内存哈希图只是一种优化,因此您可以格外小心,并且仅在有可用内存时才这样做。您可以轻松测量可用堆的数量(即 API)并做出相应的决定。您可以收听内存不足的通知事件(谷歌关于那些)。您甚至可以捕获分配失败的 OutOfMemoryError 异常并在运行时更改内存策略。
您正在一个难以精确测量的领域中玩耍。请务必在多个设备和多个 Android 版本上进行质量检查。要模拟低内存设置,请尝试使用您能找到的最旧的设备。