gpt4 book ai didi

java - Dalvik 中 'short' 字段所需的内存?

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:53:22 26 4
gpt4 key购买 nike

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 行)为新对象分配空间。分配的大小基于 ClassObjectobjectSize 字段。 objectSizecomputeFieldOffsets 中设置(第 3543 行)。如果您发现此函数中 fieldOffset 递增的每个实例,您会注意到它始终以 4 个字节为步长递增。

短字段占用 4 个字节。

关于java - Dalvik 中 'short' 字段所需的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13070401/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com