zoukankan      html  css  js  c++  java
  • 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

    本博客所有文章仅用于学习、研究和交流目的,版权归作者所有,欢迎非商业性质转载。

    如果本篇博客给您带来帮助,请作者喝杯咖啡吧!点击下面打赏,您的支持是我最大的动力!

  • 相关阅读:
    Servlet文件上传下载
    通过jquery将多选框变单选框
    Java 浮点数精度控制
    JS实现点击table中任意元素选中
    SpringMVC-时间类型转换
    SpringMVC--提交表单
    路径 专题
    防盗链
    Request
    RequestResponse简介
  • 原文地址:https://www.cnblogs.com/originator/p/15435378.html
Copyright © 2011-2022 走看看