对象的创建过程

  • 一. 对象的创建过程
    • ①. 类加载检查
    • ②.分配内存
    • ③. 初始化零值
    • ④. 设置对象头
    • ⑤. 执行init方法
  • 二. 对象的内存布局
    • ①. 对象头
    • ②. 实例数据
    • ③. 对齐填充
  • 三. 对象的访问定位
    • ①. 使用句柄访问对象
    • ②. 使用直接指针访问对象

一. 对象的创建过程

①. 类加载检查

  • 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程。
  • 上一篇博客类的加载全过程分析

②.分配内存

  • 在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需的内存大小在类加载完成后便可确定,为对象分配空间的任务等同于把一块确定大小的内存从 Java 堆中划分出来。

分配方式有 指针碰撞空闲列表 两种

  • 指针碰撞:如果jvm的垃圾收集器采用复制算法或标记-整理算法,那么堆中空闲内存是完整的区域,并且空闲内存和已使用内存之间由一个指针标记。那么当为一个对象分配内存时,只需移动指针即可(指针向空间那边挪动一段与对象大小相等的距离)。
  • 空闲列表: 如果jvm的垃圾收集器采用标记-清除算法,那么堆中空闲区域交错,因此,虚拟机需要维护一个列表记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录。

由于JVM创建对象的行为非常频繁,因此需要考虑内存分配的并发问题解决方案:

  1. 对分配内存空间的动作进行同步:用CAS失败重试的方式
  2. 把内存分配的动作按照线程划分在不同的空间中进行,每个线程在Java堆中预先分配一小块内存,即本地线程分配缓冲TLAB,各线程首先在TLAB上分配内存,TLAB使用完之后,分配新的TLAB时才需要同步锁定。JVM是否使用TLAB可以通过**-XX:+/-UseTLAB**参数指定。

③. 初始化零值

  • 内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值(不包括对象头),这一步操作保证了对象的实例字段在 Java 代码中可以不赋初始值就直接使用,程序能访问到这些字段的数据类型所对应的零值。

④. 设置对象头

  • 初始化零值完成之后,虚拟机要对对象进行必要的设置

⑤. 执行init方法

  • 在上面工作都完成之后,从虚拟机的视角来看,一个新的对象已经产生了,但从 Java 程序的视角来看,对象创建才刚开始,<init> 方法还没有执行,所有的字段都还为零。所以一般来说,执行 new 指令之后会接着执行<init> 方法,把对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完全产生出来。

二. 对象的内存布局

  • 在 Hotspot 虚拟机中,对象在内存中的布局可以分为 3 块区域:对象头实例数据对齐填充

①. 对象头

对象头:两部分数据构成

  1. 用于存储对象自身的运行时数据:如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳、等。32 位虚拟机占 32 bit,64 位虚拟机占 64 bit。官方称为 Mark Word
  2. 类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。如果对象是一个java数组,那在对象头中还必须有一块用于记录数组长度的数据。因为虚拟机可以通过普通java对象的元数据信息确定java对象的大小,但是从数组的元数据中无法确定数组的大小。

②. 实例数据

实例数据:

  • 对象真正存储的有效信息,也是在程序代码中定义的各类型的字段内容。它就是成员变量的值,其中包含父类的成员变量和本类的成员变量。

③. 对齐填充

对齐填充:不是必需存在的,为了字节填充,仅起到占位符的作用。

  • 仅仅起着占位符的作用,由于HotSpot要求对象的总长度必须是8字节的整数倍。由于对象头一定是8字节的整数倍,但实例数据部分的长度是任意的,因此需要对齐填充字段来补全,确保整个对象的长度为8的整数倍。

三. 对象的访问定位

  • 建立对象就是为了使用对象,我们的 Java 程序通过栈上的 reference 数据来操作堆上的具体对象。
  • 访问方式有 使用句柄直接指针两种

①. 使用句柄访问对象

  • 如果使用句柄的话,那么 Java 堆中将会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息;

②. 使用直接指针访问对象

  • 直接指针: 如果使用直接指针访问,reference 中存储的直接就是对象的地址。

JVM基础知识---对象的创建过程相关推荐

  1. 深入理解JVM:java对象的创建过程?

    Step1:类加载检查 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过.解析和初始化过.如果没有,那必须先 ...

  2. JVM基础知识和调优

    JVM基础知识和调优 什么是垃圾 当一个对象有人引用它时,那么就不是垃圾,不然就不是垃圾 如何辨别一个对象是不是垃圾 计数(最基础的),有一个对象引用就记一个数(i++)问题,循环引用 GC root ...

  3. JAVA面试题之JVM基础知识

    JAVA面试题总结-JVM的基础知识 JAVA面试题之JVM基础知识 说一下JVM的主要组成部分及作用 说一下 jvm 运行时数据区? 说一下堆和栈的区别? 队列和栈是什么?有什么区别? 什么是双亲委 ...

  4. java实例化类之后如何赋值_深入理解Java对象的创建过程:类的初始化与实例化...

    摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类 ...

  5. 深入理解Java对象的创建过程:类的初始化与实例化

    摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类 ...

  6. java初始化实例化_Java对象的创建过程:类的初始化与实例化

    一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...

  7. java 句柄池_深入理解JVM之Java对象的创建、内存布局、访问定位详解

    本文实例讲述了深入理解JVM之Java对象的创建.内存布局.访问定位.分享给大家供大家参考,具体如下: 对象的创建 一个简单的创建对象语句Clazz instance = new Clazz();包含 ...

  8. Java对象的创建过程:类的初始化与实例化

    一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...

  9. Java对象的创建过程

    对象的创建过程: ①将class load到内存: ②申请内存: ③成员变量赋默认值: ④调用构造方法<init>,同时,成员变量顺序赋初始值,执行构造方法语句,会先调用父类的构造方法,有 ...

最新文章

  1. 后端怎么防止重复提交?(常用的做法)
  2. CI框架验证码CAPTCHA 辅助函数的使用
  3. jQuery中排除指定元素,同时选择剩下的所有元素
  4. php switch case 判断语句,PHP的switch判断语句的“高级”用法详解,switch详解_PHP教程...
  5. ASP.NET报错集合一----.net4.0创建项目后,在iis上部署项目,无法浏览,提示404
  6. 100个网络基础知识,赶紧收藏吧!
  7. 解决ueditor jquery javascript 取值问题
  8. 软件工程学习笔记《二》代码规范
  9. cs231n---语义分割 物体定位 物体检测 物体分割
  10. python 导航栏_解析导航栏的url--selnium,beautifulsoup实战
  11. Python读写CSV格式文件
  12. oracle 查询脚本分析,一个oracle数据查询脚本
  13. 简书bug(已修复):简友圈含英文时误删空格
  14. pymongo的常用操作
  15. 如何查询期刊论文影响力——JCR
  16. 射频信号发生器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  17. wps中复制公式到另一个文档变成图片,wps怎么调整公式的高度,wps在一页中设置一栏和两栏
  18. 微信如何为好友设置特殊铃声提醒提示音
  19. shell 脚本实战 三
  20. 上古卷轴5mo初始化python失败_《上古卷轴5》MO管理器设置方法初级教程 MO管理器怎么设置...

热门文章

  1. MZOJ #82 总统竞选
  2. ⊱静心抄经,是对抗这个浮躁社会的最好武器
  3. 44.驱动--设备树内的中断
  4. 护眼灯真的可以保护眼睛吗?市面上的护眼台灯到底是不是智商税
  5. rtx腾讯通环境配置
  6. 深度技术ghost官方原版XP系统sp3下载地址
  7. 云计算 + AI + 遥感卫星,人类对地探测进入黄金时代
  8. 随笔感悟 — 函数封装
  9. Android 以图找图功能
  10. 静态/动态博客Blog框架简介