各种数据类型在Dalvik中所占用的内存大小

原文出自 廖祜秋 《Android object size in Dalvik

本文所有JVM指的是hotspot


数据的大小

引用类型(object reference)的大小

  1. 32 bit JVM –> 4 bytes
  2. 64 bit JVM –> 8 bytes (-UseCompressedOops)
  3. 64 bit JVM –> 4 bytes (+UseCompressedOops)
  4. Dalvik always –> 4 bytes

基本数据类型(primitive data type)

  1. 在jvm中基本数据类型的大小是固定的
  2. 在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

对象内存大小度量 - CSDN博客


赞 赏
真诚赞赏 手有余香
用微信请张岩喝杯咖啡?

微信支付

用支付宝请张岩喝杯咖啡?

支付宝