JVM详解(六)——对象的实例化、内存布局与访问定位
2021/10/22 7:09:51
本文主要是介绍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采用)
注:个人感觉这里有点不对。这里的"对象实例数据"和上面图中的应该不是一回事,不然看起来好像实例数据里面包含了到对象类型数据的指针一样。这里应该叫"对象数据"比较合理一点。
这个指针,应该是放在对象头里的。
这篇关于JVM详解(六)——对象的实例化、内存布局与访问定位的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)
- 2024-05-30【Java】百万数据excel导出功能如何实现
- 2024-05-30我们小公司,哪像华为一样,用得上IPD(集成产品开发)?