java基本类型、对象内存占用

Posted on By xqw

java基本类型

1Byte(字节) = 8bit(位)
32位系统:Word(字) = 4 Byte(字节)(一个指针,内存中占据一个单独的内存单元)
64位系统:1字 = 8 字节 

在Java中一共有8种基本数据类型,其中有4种整型,2种浮点类型,1种用于表示Unicode编码的字符单元的字符类型和1种用于表示真值的boolean类型。(一个字节等于8个bit)

JAVA基本数据类型所占字节数是多少?(32位系统)
byte     1字节               
short    2字节               
int      4字节               
long     8字节               
char     2字节(C语言中是1字节)可以存储一个汉字
float    4字节               
double   8字节               
boolean  false/true(理论上占用1bit,1/8字节,实际处理按1byte处理)      

在栈上存储均被当做整型int处理,double、long两个int 



对应范围:     
类型  存储要求 范围(包含) 默认值 包装类
整 int 4字节(32位) -231~ 231-1 0 Integer
数 short 2字节(16位) -215~215-1 0 Short
类 long 8字节(64位) -263~263-1 0 Long
型 byte 1字节(8位) -27~27-1 0 Byte
浮点 float 4字节(32位) -3.4e+38 ~ 3.4e+38 0.0f Float
类型 double 8字节(64位) -1.7e+308 ~ 1.7e+308 0 Double
布尔 boolean 1/8字节(1位) true, false FALSE Boolean

int类型表示

原码:第一为符号位   
反码:符号位外取反   
补码:正数位原码,负数为反码+1,计算中存储都为补码   

>>:带符号右移。正数右移高位补0,负数右移高位补1。
>>>:无符号右移。无论是正数还是负数,高位通通补0。    ```java
    System.out.println(2<<3);//16 
    0000 0000 0000 0000 0000 0000 0000 0010
    
    System.out.println(-2>>1);//-1 
    //-2: 1111 1111 1111 1111 1111 1111 1111 1110 
    //右移补1::1111 1111 1111 1111 1111 1111 1111 1111
    //补码得原码,减1取反 1000 0000 0000 0000 0000 0000 0000 0001
    
    System.out.println(-2>>>1);//0111 1111 1111 1111 1111 1111 1111 ```

浮点型及表示

类型              存储需求         bit数    取值范围      备注
float              4字节           4*8                  float类型的数值有一个后缀F(例如:3.14F)
double             8字节           8*8                       没有后缀F的浮点数值(如3.14)默认为double类型
float:
1符号,8指数,23尾数
公式:十进制的值=2^(指数-127)*(1+分数) (也就是 尾数+1 小数点再移动 指数-127 位)

例:
1 1000 0001 010 0000 0000 0000 0000 0000  : -5
1 1000 0000 100 1000 0000 0000 0000 0000  :-3.125
1 0111 1100 000 0000 0000 0000 0000 0000  :-0.125

-5计算
指数为129
-1*2^(129-127)*(1+1*2^-2) = -1*4*(5/4) = -5

对象占用:

一个对象大小=对象头(8/16bytes)+数据大小+补齐大小
普通对象:对象头 2字(32位8 64位16)
数组对象:对象头 3字(32位12 64位24)

HotSpot的对齐方式为8字节对齐:
(对象头 + 实例数据 + padding) % 8等于0且0 <= padding < 8

受指针压缩(vm参数:UseCompressedOops)影响
64位机器
普通对象:对象头 16->12bytes
数组对象:对象头 24->16
reference类型 8->4

参考:一个Java对象到底占多大内存?

对象头里都存了什么: class对象的引用、锁、数组长度等


来源–《java并发编程艺术》

关于锁膨胀