Java 虚拟机也可以为 short
字段使用 int
大小的宽度(这取决于它们的内部实现)。只有数组 (short[]
) 是异常(exception),它总是保证它们在内部占用的空间也比 int[]
少。 Dalvik 怎么样?
例如我有一个包含 50 个 short
类型字段的类。有时在我的应用程序中,存在 10000 个这样的类。这意味着 short
字段应该使用 1MB 内存,但是如果 Dalvik 在内部使用 4 个字节作为 short
值,那么这将是 2MB 内存用法。
我应该期望 Dalvik 使用多少内存? (这是指它的内部内存使用,我知道它可能不会反射(reflect)在系统内存使用中,例如因为 Dalvik 已经从系统中预留了更多的内存。)
最佳答案
在 dalvik 中,double 和 long 字段是 8 个字节,其他所有字段(包括 short)都是 4 个字节。
另一方面,短数组每个元素占用 2 个字节(除了用于数组 + 对象簿记的前期空间)。
数组
new-array
操作码调用 dvmAllocArrayByClass
(第 71 行)分配空间。然后调用 dvmAllocPrimitiveArray
(第 113 行)。在 dvmAllocPrimitiveArray
的开关中,'S' 大小写用于短数组。您可以看到它调用 allocArray
(第 38 行),width=2。
在 allocArray
中,它执行以下计算来计算数组的大小:
size_t elementShift = sizeof(size_t) * CHAR_BIT - 1 - CLZ(elemWidth);
size_t elementSize = length << elementShift;
size_t headerSize = OFFSETOF_MEMBER(ArrayObject, contents);
size_t totalSize = elementSize + headerSize;
简而言之,在 32 位系统上,此计算将是:
size_t elementShift = (4 * 8) - 1 - 30; //== 1;
size_t elementSize = length << 1; //i.e. length * 2
size_t headerSize = <some constant value>;
size_t totalSize = length*2 + <some constant value>;
短数组每个元素占用 2 个字节。
字段
new-instance
操作码调用 dvmAllocObject
(第 181 行)为新对象分配空间。分配的大小基于 ClassObject
的 objectSize
字段。 objectSize
在 computeFieldOffsets
中设置(第 3543 行)。如果您发现此函数中 fieldOffset 递增的每个实例,您会注意到它始终以 4 个字节为步长递增。
短字段占用 4 个字节。
关于java - Dalvik 中 'short' 字段所需的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13070401/