JVM详解(六)——对象的实例化、内存布局与访问定位
2024-09-02 18:15:41
一、对象的实例化
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采用)
注:个人感觉这里有点不对。这里的"对象实例数据"和上面图中的应该不是一回事,不然看起来好像实例数据里面包含了到对象类型数据的指针一样。这里应该叫"对象数据"比较合理一点。
这个指针,应该是放在对象头里的。
最新文章
- [LeetCode] Walls and Gates 墙和门
- ARP协议学习
- MySQL functions, IF, CASE
- HDU 1077Catching Fish(简单计算几何)
- CF 294C(Java大数做计数)
- offsetParent和parentNode区别
- watch命令详解(linux)
- selenium C#下的zencart自动化测试(WFloginUrlPayment)环境4.0
- PHP GD库生成图片自动换行函数,自动分页函数
- 给定一个实数数组,按序排列(从小到大),从数组从找出若干个数,使得这若干个数的和与M最为接近,描述一个算法,并给出算法的复杂度。
- python5 数字类型 字符串类型 列表类型
- MVC过滤器使用方法
- bzoj千题计划318:bzoj1396: 识别子串(后缀自动机 + 线段树)
- 【BZOJ】3144: [Hnoi2013]切糕
- 浅谈table、form 标签
- python BeautifulSoup库用法总结
- VSCode环境
- sublime text3及插件安装过程
- Linux C 重定向简单范例
- 成都Uber优步司机奖励政策(2月25日)