java对象头
java由三部分组成:
- 对象头(标记字+类指针) 大小固定 (非数组类型)64位虚拟机对象头位12byte(标记字8字节) 32位虚拟机对象头位8byte
- 实例数据 (如:int型4byte)
- 数据对齐(填充数据)对象头+示例数据 = n*8 byte 不足的就用填充数据
标记字记录的信息:1.锁信息 2.gc信息 3.hashcode
使用jol包证明:
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.10</version>
</dependency>
public class User {
private int id;
private boolean flag;
private Integer age = 1;
private boolean[] arr = {false};
}
import cn.laolei.pojo.User;
import org.openjdk.jol.info.ClassLayout;
/**
* 测试对象头
*/
public class Test {
static User user = new User();
public static void main(String[] args) {
String printable = ClassLayout.parseInstance(user).toPrintable();
System.out.println(printable);
}
}
此结果不能证明:
单个boolean变量占4字节 boolean数组中每个占1字节
与此jar包机制有关
64位:1,2行为标记字8字节 3行为类指针
32位:
引用类型本质是一个指针,64位占8字节,但是java中压缩了,只占4个字节。
禁用参数后:
如果堆内存超过32G将自动禁用压缩参数 现在的64位机器实际上只有48根总线,也就是说只有48位可用。