Tho*_*alc 8 java android dalvik
Java虚拟机也可以int对short字段使用-sized width (这取决于它们的内部实现).只有数组(short[])是例外,它总是保证它们占用的空间比int[]内部空间少.Dalvik怎么样?
例如,我有一个包含50个字段的类short.有时在我的应用程序中,存在10000个这样的类.这意味着short字段应该使用1MB的内存,但如果 Dalvik在short内部使用4个字节的值,那么这将是2MB的内存使用量.
我应该期待Dalvik使用多少内存?(这是指它的内部内存使用,我知道它可能不会被系统内存使用所反映,例如因为Dalvik已经从系统中预留了更多的内存.)
在 dalvik 中,double 和 long 字段为 8 个字节,其他所有字段(包括短字段)为 4 个字节。
另一方面,短数组每个元素占用 2 个字节(除了用于数组+对象簿记的前期空间)。
数组
new-array操作码调用(dvmAllocArrayByClass第 71 行)来分配空间。然后调用dvmAllocPrimitiveArray(第 113 行)。在 中的开关中dvmAllocPrimitiveArray,“S”大小写用于短数组。您可以看到它allocArray以 width=2 调用(第 38 行)。
在 中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;
Run Code Online (Sandbox Code Playgroud)
简而言之,在 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>;
Run Code Online (Sandbox Code Playgroud)
短数组每个元素占用 2 个字节。
领域
操作new-instance码调用dvmAllocObject(第 181 行)为新对象分配空间。分配的大小基于 的objectSize字段ClassObject。objectSize设置在computeFieldOffsets(第 3543 行)。如果您发现此函数中 fieldOffset 递增的每个实例,您会注意到它总是以 4 个字节为增量递增。
短字段占用 4 个字节。