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)

  1. 对象开销(16字节):指向对象的类的引用,垃圾收集信息,同步信息
  2. 成员内存(N*8):
    1. 基本数据类型(<=4位的会进行填充,直到8字节)
    2. 应用数据类型:直接存储地址(8字节)
  • 内部类(16+8+N*8)

比普通的类多了一个指向外部类的引用(8字节)

  • 数组

    • 基本数据类型数组(16+4+4+N*size+填充字节)
      1. 对象开销(16字节):指向对象的类的引用,垃圾收集信息,同步信息
      2. 数组长度信息(4字节+4字节填充)
      3. 基本数据的字节数(size)×数量+填充字节(大小不一,只为保证内存长度为8的倍数)
    • 引用数据类型(16+4+4+N*size)
      1. 对象开销(16字节):指向对象的类的引用,垃圾收集信息,同步信息
      2. 数组长度信息(4字节+4字节填充)
      3. 引用数据的字节数(size)×数量(参见对象)
  • 字符串(16+8+4+4+4+4=40 || 40+额外开销)

    • 原始字符串
      1. 对象开销(16字节):指向对象的类的引用,垃圾收集信息,同步信息
      2. 指向字符数组的引用,没错,String其实是用char[]实现的(8字节)
      3. 字符数组的偏移量(4字节)
      4. 计数器(字符数组的长度)(4字节)
      5. 散列值(用于哈希查找,提高查找效率)(4字节)
      6. 填充字节(ps:没错我又来了)(4字节)
      7. 额外开销(字符串的开销 24+2N+填充字节)
    • 子字符串

当一个字符串是原始字符串的子串的时候,它其实使用的父串的字符数组的一部分,所以它不需要额外开销,也就是一个子串所需的内存空间上常数(固定的40),构建它需要的时间也是常数

 

全部评论

相关推荐

不愿透露姓名的神秘牛友
02-12 18:14
RT,这周五就是情人节了,前女友给我发了消息,我该不该回?
Yoswell:原则上来说让她滚,但是本着工作很累下班想吃瓜的心态,我觉得你可以回一下
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务