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采用)

  注:个人感觉这里有点不对。这里的"对象实例数据"和上面图中的应该不是一回事,不然看起来好像实例数据里面包含了到对象类型数据的指针一样。这里应该叫"对象数据"比较合理一点。
  这个指针,应该是放在对象头里的。

posted @ 2021-10-21 21:54  Craftsman-L  阅读(111)  评论(0编辑  收藏  举报