各种数据类型在Dalvik中所占用的内存大小
原文出自 廖祜秋 《Android object size in Dalvik》
本文所有JVM指的是hotspot
数据的大小
引用类型(object reference)的大小
- 32 bit JVM –>
4
bytes - 64 bit JVM –>
8
bytes (-UseCompressedOops) - 64 bit JVM –>
4
bytes (+UseCompressedOops) - Dalvik always –>
4
bytes
基本数据类型(primitive data type)
- 在jvm中基本数据类型的大小是固定的
- 在dalvik中,基本数据类型的大小是不同的,而且作为一个对象字段或者是作为数组中的元素所占用的大小也是不相同的
对象的大小
详情可见 1.《Java对象的内存布局以及对象所需内存大小计算详解》 2.《对象内存大小度量 - CSDN博客》
对齐填充
(对象头 + 实例数据 + padding) % 8等于0且0 <= padding < 8 在Dalvik中对象的边界对齐规则和JVM一样都是8个字节的倍数
对象的开销(Overhead of Object)
JVM中对象头大小
32位 | 64位 (+) | 64位 (-) |
---|---|---|
8 bytes | 12 btyes | 16 bytes |
JVM对象大小计算方式具体实现《一个Java对象到底占用多大内存》
Dalvik中是不同的
overhead of Object | overhead of dlmalloc | data |
---|---|---|
8 bytes | 4 or 8 bytes |
还有4 or 8 bytes的开销用在dlmalloc
所以Dalvik中,一个空对象需要消耗16bytes( 12bytes是overhead,4byte用来对齐)
class EmptyClass {
}
Total size:8 (Object overhead) + 4 (dlmalloc) = 12 bytes. 最后需要对齐,所以要再加4bytes .最终为16bytes
class Integer {
int value; // 4 bytes
}
8(overhead)+4(dlmalloc)+4(int) = 16 + 0(对齐) = 16;
static class HashMapEntry<K, V> {
final K key; // 4 bytes
final int hash; // 4 bytes
V value; // 4 bytes
HashMapEntry<K, V> next; // 4 bytes
}
8(overhead)+4(dlmalloc)+4*4 = 28 + 4(对齐) = 32
数组的大小
overhead of Object | overhead of dlmalloc | size | padding | data |
---|---|---|---|---|
8 bytes | 4 or 8 bytes | 4 bytes | 4 bytes |
所以byte[0] : 8 + 4 + 4 + 4 = 20 bytes.对齐后为 24 bytes.
byte[0] ~ byte[4] 都是 24 bytes.
String的大小
class String {
private final char[] value; // 4 bytes
private final int offset; // 4 bytes
private final int count; // 4 bytes
private int hashCode; // 4 bytes
}
对象本身为8(overhead) + 4(dlmalloc) + 4*4 = 28 对齐后为 32btyes value数组最少有24bytes
一个空的字符串对象仍然需要32bytes的
shadow heap
,和24bytes的retained heap
赞 赏
真诚赞赏 手有余香

微信支付

支付宝