JVM详解(六)——对象的实例化、内存布局与访问定位
一、对象的实例化
1、创建对象的方式
2、创建对象的步骤
脑图:https://www.processon.com/view/link/61701a927d9c087040525226
3、对象属性赋值的步骤
①属性的默认初始化——对应脑图中"创建对象的步骤"4
②显式初始化——对应脑图中"创建对象的步骤"6
③代码块中初始化——对应脑图中"创建对象的步骤"6
④构造器中初始化——对应脑图中"创建对象的步骤"6
注意:②、③是并列的,执行顺序取决于在代码中的先后顺序。
代码示例:演示②、③执行顺序
1 public class Main { 2 3 { 4 // ③代码块中初始化: num = 200 5 num = 200; 6 } 7 8 // ①属性的默认初始化: num = 0 9 // ②显式初始化: num = 10 10 int num = 10; 11 12 public static void main(String[] args) { 13 Main m = new Main(); 14 15 System.out.println(m.num); // 10 16 } 17 } 18 19 20 public class Main { 21 22 int num = 10; 23 24 { 25 num = 200; 26 } 27 28 public static void main(String[] args) { 29 Main m = new Main(); 30 31 System.out.println(m.num); // 200 32 } 33 }
4、从字节码看对象实例化过程
二、对象的内存布局
1、对象头
2、实例数据
3、对齐填充
脑图:https://www.processon.com/view/link/6170441d63768961e9dc38fc
代码示例:演示对象内存布局
1 public class Customer { 2 int id = 1001; 3 String name; 4 Account acct; 5 6 { 7 name = "匿名客户"; 8 } 9 10 public Customer() { 11 acct = new Account(); 12 } 13 14 } 15 16 class Account { 17 18 } 19 20 // 测试类 21 public class Main { 22 public static void main(String[] args) { 23 Customer cust = new Customer(); 24 } 25 }
三、对象的访问定位
1、介绍
Java虚拟机规范中,并没有明确的规定,采用哪种访问方式。Hotspot采用的是直接指针。
脑图:https://www.processon.com/view/link/6170d2cf1e0853446e56c089
2、句柄访问
3、直接指针(Hotspot采用)
注:个人感觉这里有点不对。这里的"对象实例数据"和上面图中的应该不是一回事,不然看起来好像实例数据里面包含了到对象类型数据的指针一样。这里应该叫"对象数据"比较合理一点。
这个指针,应该是放在对象头里的。
作者:Craftsman-L
本博客所有文章仅用于学习、研究和交流目的,版权归作者所有,欢迎非商业性质转载。
如果本篇博客给您带来帮助,请作者喝杯咖啡吧!点击下面打赏,您的支持是我最大的动力!