Java 数据类型内存分析
基本数据类型:
由上向下,可以自动转型,注意:整形可以转换成浮点型,但会有精度损失,浮点型内部是科学计数法储存的
- byte (1 byte = 8 bit )
- short ( 2 byte ) char ( 2 byte )
- int ( 4 byte )
- long ( 8 byte )
- float ( 4 byte )
- double (8 byte)
引用数据类型:
注意:一般内存的使用会填充为8字节(64位计算机的机器字)的倍数
-
普通对象(16+N*8)
- 对象开销(16字节):指向对象的类的引用,垃圾收集信息,同步信息
- 成员内存(N*8):
- 基本数据类型(<=4位的会进行填充,直到8字节)
- 应用数据类型:直接存储地址(8字节)
-
内部类(16+8+N*8)
比普通的类多了一个指向外部类的引用(8字节)
-
数组
- 基本数据类型数组(16+4+4+N*size+填充字节)
- 对象开销(16字节):指向对象的类的引用,垃圾收集信息,同步信息
- 数组长度信息(4字节+4字节填充)
- 基本数据的字节数(size)×数量+填充字节(大小不一,只为保证内存长度为8的倍数)
- 引用数据类型(16+4+4+N*size)
- 对象开销(16字节):指向对象的类的引用,垃圾收集信息,同步信息
- 数组长度信息(4字节+4字节填充)
- 引用数据的字节数(size)×数量(参见对象)
- 基本数据类型数组(16+4+4+N*size+填充字节)
-
字符串(16+8+4+4+4+4=40 || 40+额外开销)
- 原始字符串
- 对象开销(16字节):指向对象的类的引用,垃圾收集信息,同步信息
- 指向字符数组的引用,没错,String其实是用char[]实现的(8字节)
- 字符数组的偏移量(4字节)
- 计数器(字符数组的长度)(4字节)
- 散列值(用于哈希查找,提高查找效率)(4字节)
- 填充字节(ps:没错我又来了)(4字节)
- 额外开销(字符串的开销 24+2N+填充字节)
- 子字符串
- 原始字符串
当一个字符串是原始字符串的子串的时候,它其实使用的父串的字符数组的一部分,所以它不需要额外开销,也就是一个子串所需的内存空间上常数(固定的40),构建它需要的时间也是常数