1、.class文件通过classloader加载
2、连接(验证,准备(给static变量赋默认值),解析)
3、类初始化(给static变量赋值,同时执行static代码块)
123之后类已经初始化完成,下来456就是对象的创建
4、申请对象内存
5、成员变量赋默认值
6、调用构造方法<init>
6.1、成员变量顺序赋初始值
6.2、执行构造方法语句
先查看虚拟机的配置:因为对象的大小和虚拟机的设置虚拟机的实现都有关系。
java -XX:+PrintCommandLineFlags -version 这个命令可以查看虚拟机的配置
普通对象:开启压缩是16字节,不开启压缩也是16字节
1、对象头:markword 长度8字节
2、ClassPointer class的指针:指向T.class -XX:+UseCompressedClassPointers 4字节 不开启为8字节
3、实例数据:1、引用类型:-XX:+UseCompressedOops 为4字节 不开启为8字节
Oops:Ordinary object Pointers
4、Padding对齐:8的倍数
那么普通对象在内存中的大小就是 markword 8字节+4字节(默认开启指针压缩,本来是8字节)+因为是空对象所以没有实例数据0字节 = 12字节+padding 4字节 = 16字节
不开启指针压缩的话:markword 8字节+8字节(开启指针压缩)=16字节+padding 0字节 = 16字节
数组对象:开启压缩是16字节,不开启压缩是24字节
1、2同上
3、数组长度:4字节
4、数组数据
5、对齐 8的倍数
开启指针压缩是:markword 8字节+指针4字节+数组长度4字节 = 16字节+padding 0字节 =16字节
不开启指针压缩是:markword 8字节+指针8字节+数组长度4字节 = 20字节+padding 4字节 =24字节 (加padding后需要是8的倍数)
假如一个类里有int age(4字节); String name(64位是8字节,但是虚拟机开启了-XX:+UseCompressedOops,所以是4字节了); Object o(4字节); 那么这个类对象所占的字节数 = markword 8字节 +4字节(指针压缩)+age4字节+name4字节+o4字节 = 24字节
1、4G以下,砍掉高32位
2、4-32G,默认开启 实例数据:引用类型:-XX:+UseCompressedOops 为4字节 不开启为8字节 Oops:Ordinary object Pointers
3、32G 压缩无效使用64位,,所以内存不是越大越好。
下图是markword
所以这里用4bit来表示GC的分代年龄,也就是说:age>15的时候讲从年轻代进入老年代。4bit最大就是1111,就是15。
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
添加我为好友,拉您入交流群!
请使用微信扫一扫!