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

标签 java android dalvik

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/

相关文章:

android - 在 Android Unity 上找不到 gdiplus.dll

java - 在 Android Dalvik VM 中加载 java.util.logging.LogManager 的类初始化问题

android - adb reboot 命令挂起模拟器选项

java - 从 Eclipse 运行 Struts2 应用程序时出现不同的错误

java - 使用 MyBatis 将数据从数据库映射到 Java Rest Web 服务中的 JSON

java - 如何处理和自定义 Spring boot ldap 的错误 401?

Android AlarmManager.setExactAndAllowWhileIdle() 和 WakefulBroadcastReceiver 在一些新制造的低价设备中不起作用

java - Android 中的过滤数组

java - 垃圾收集器并清空 onDestroy 中的引用

java - 如何在Spring MVC中将多维数组处理为@RequestParam?