大白话读懂java对象创建的过程

news2025/3/28 17:57:33

1. java对象创建流程(大白话版)

咱们java对象被创建的过程大致如下,即:

在 JVM 中对象的创建,从⼀个 new 指令开始:
  1. 首先检查这个指令的参数是否能在常量池中定位到⼀个类的符号引用
  2. 检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,就先执行相应的类加载过程
  3. 类加载检查通过后,接下来虚拟机将为新生对象分配内存
  4. 内存分配完成之后,虚拟机将分配到的内存空间(但不包括对象头)都初始化为零值。
  5. 接下来设置对象头,请求头⾥包含了对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。

没听懂?没关系,咱们来看看下面这个例子:

想象你在秋招时一路过关斩将,现在终于准备入职了,这时候会有以下流程:

  1. 背景调查 → 检查类是否已加载(HR查你的学历)
  2. 分配工位 → 分配内存(给你分一个工位)
  3. 初始化设备 → 内存清零(工位电脑装好系统)
  4. 贴工牌 → 设置对象头(给你发工牌和权限)
  5. 入职培训 → 执行构造函数(教你公司规则)

    这个入职的流程就跟咱们java对象创建的过程差不多,下面咱们来分步骤一一详解。

    2. 分步骤详解

    Step 1:类加载检查

    new指令触发时,JVM会问:"这个类合法吗?"

    这时候会检查常量池中的符号引用,触发类加载机制加载 → 验证 → 准备 → 解析 → 初始化


    Step 2:分配内存

    • 方式1:指针碰撞(内存规整时)
    • 方式2:空闲列表(内存碎片化时)

    通过CAS + 失败重试保证线程安全,可能使用TLAB(线程私有分配缓冲区)

    就好像工位分配有两种策略:连续工区直接划一块(指针碰撞),或从碎片工位里拼凑(空闲列表)。

    指针碰撞:假设 Java 堆中内存是 绝对规整 的,所有被使用过的内存都被放在⼀边,空闲的内存被
    放在另⼀边,中间放着⼀个指针作为分界点的指针,那所分配内存就仅仅是把那个指针向空闲空
    间⽅向挪动⼀段与对象大小相等(这里假设是两块内存大小单位)的距离。

    空闲列表:如果 Java 堆中的内存并 不是规整的 ,已被使用的内存和空闲的内存相互交错在⼀起,
    那就没有办法简单地进行指针碰撞了,虚拟机这时候就必须维护⼀个列表,记录上哪些内存块是可用的, 在分配的时候从列表中找到⼀块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称为“空闲列表”。

    Step 3:内存清零

    将分配的内存初始化为零值(int→0,boolean→false,引用→null),保证对象实例字段不赋初值也能直接使用。就好比给你的工位电脑格式化,装好干净的系统。


    Step 4:设置对象头

    对象头内容:

    • Mark Word:哈希码、GC分代年龄、锁状态等
    • 类型指针:指向类元数据的指针

    对象头占12字节(64位JVM开启压缩指针时),就好像给你工牌贴上姓名、工号、部门等信息。


    Step 5:执行构造函数

    执行<init>方法(显式初始化成员变量),从子类到父类递归调用构造函数

    HR带你熟悉公司,布置你的工位(这才是你看到的new Object()的最终效果)。

          步骤                   技术细节                 比喻
    类加载检查双亲委派机制,元数据验证入职前的背景调查
    分配内存CAS + TLAB避免并发冲突抢会议室避免冲突
    内存清零零值初始化(JVM层)工位电脑格式化
    对象头设置Mark Word + 类型指针工牌信息(姓名/部门)
    构造函数执行程序员可见的初始化(Java层)布置工位(放私人物品)

    3. 代码示例

    Object obj = new Object();

    JVM背后做的事:

    1. 检查Object类是否加载 → 没加载则加载类
    2. 分配内存(假设8字节)
    3. 内存清零 → 所有字段为0/null
    4. 设置对象头(MarkWord + 类型指针指向Object.class)
    5. 调用Object的构造函数(这里是个空方法)

    4. 高频面试问题

    (1)为什么先清零再执行构造函数?
    :保证对象创建时字段一定有初始值(避免脏数据)。

    (2)内存分配如何保证线程安全?
    : CAS + 失败重试 或 TLAB(线程本地分配缓冲)。

    (3)对象头和对象体是什么关系?
    :对象头是元数据(如锁、GC信息),对象体是实例数据。

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2318880.html

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

    相关文章

    AI图像理解技术的演进

    在CLIP等现代多模态模型出现之前&#xff0c;早期的图生文技术主要依赖人工标注的ImageNet等数据集&#xff0c;但其技术路线与当前方法存在本质差异。 一、传统图生文技术的标注依赖 ImageNet的核心地位 在2012-2020年间&#xff0c;ImageNet的1,400万张人工标注图像&#xff…

    电脑节电模式怎么退出 分享5种解决方法

    在使用电脑的过程中&#xff0c;许多用户为了节省电力&#xff0c;通常会选择开启电脑的节能模式。然而&#xff0c;在需要更高性能或进行图形密集型任务时&#xff0c;节能模式可能会限制系统的性能表现。这时&#xff0c;了解如何正确地关闭或调整节能设置就显得尤为重要了。…

    【Java】——程序逻辑控制(构建稳健代码的基石)

    &#x1f381;个人主页&#xff1a;User_芊芊君子 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 &#x1f50d;系列专栏&#xff1a;【Java】内容概括 文章目录&#xff1a; 一.顺序结构二.分支结构1.if 语句1.1 语法格式11.2 语法格式21.3 语法格式3 …

    卫星互联网智慧杆:开启智能城市新时代​

    哇哦&#xff01;在当下这个数字化浪潮正以雷霆万钧之势席卷全球的超酷时代&#xff0c;智慧城市建设已然成为世界各国你追我赶、竞相发力的核心重点领域啦&#xff01;而咱们的卫星互联网智慧杆&#xff0c;作为一项完美融合了卫星通信与物联网顶尖技术的创新结晶&#xff0c;…

    Qt-QChart实现折线图

    一、介绍场景 动态查看数据变化&#xff0c;或者了解数据发展趋势&#xff0c;让数据可以形象直观展现出来&#xff0c;这里推荐使用折线图的方式展现&#xff0c;本文抛砖引玉&#xff0c;简单实现一个实例&#xff0c;效果图如下&#xff1a; 二、实现步骤 1、charts组件 …

    取消Win10锁屏界面上显示的天气、市场和广告的操作

    要取消Win10锁屏界面上显示的天气、市场和广告&#xff0c;您可以按照以下步骤操作&#xff1a; 方法一&#xff1a;更改锁屏界面设置 打开“设置”&#xff1a; 点击“开始”菜单&#xff0c;然后点击齿轮状的“设置”图标。 进入“个性化”&#xff1a; 在“设置”窗口中&a…

    从TouchDriver Pro到Touchdriver G1,Weart触觉手套全系解析:XR交互的“真实触感”如何实现?

    Weart旗下的Touchdriver Pro触觉手套和Touchdriver G1触觉手套&#xff0c;凭借其技术创新&#xff0c;为用户带来了全新的触觉体验。Touchdriver Pro触觉手套通过多模态触觉反馈技术&#xff0c;提供力反馈、纹理渲染和温度提示&#xff0c;让用户在虚拟环境中感受到真实的触觉…

    排序算法实现:插入排序与希尔排序

    目录 一、引言 二、代码整体结构 三、宏定义与头文件 四、插入排序函数&#xff08;Insertsort&#xff09; 函数作用 代码要点分析 五、希尔排序函数&#xff08;ShellSort&#xff09; 函数作用 代码要点分析 六、打印数组函数&#xff08;PrintSort&#x…

    UDP协议原理

    UDP协议原理 本篇介绍 在前面使用UDP编程时已经基本了解了UDP的工作模式&#xff0c;也知道了UDP有三个特点&#xff1a; 无连接不可靠面向数据报 但是当时并没有具体谈论为什么UDP有以上三个特点&#xff0c;基于这个原因&#xff0c;本篇就会针对这三个原因进行介绍 UDP…

    EtherCAT转Modbus网关如何在倍福plc组态快速配置

    EtherCAT转Modbus网关如何在倍福plc组态快速配置 在工业控制领域&#xff0c;EtherCAT和Modbus是两种常见的总线通信协议。EtherCAT以其高速的数据传输和灵活的网络配置被广泛应用于高性能自动化控制系统中&#xff0c;而Modbus则因其简单、稳定且兼容性强而被许多设备所支持。…

    DooTask在Linux的离线部署教程

    DooTask在Linux的离线部署教程 下载安装包 从网盘中将安装包下载到本地&#xff0c;下载地址 通过网盘分享的文件&#xff1a;DooTask项目管理工具 链接: https://pan.baidu.com/s/1hGmLXonT4c8hLiDP1QBr8w?pwdgdp6 提取码: gdp6 通过网盘分享的文件&#xff1a;DooTask项目…

    Python实现WYY音乐下载

    一、需求背景 WYY音乐作为国内主流音乐平台,其歌曲资源丰富但下载接口存在多重加密保护。本文将通过Python结合JS逆向技术,解析其核心加密逻辑,实现免费歌曲的下载功能。 二、技术难点分析 1. 接口加密机制 通过抓包分析可知,网易云核心接口使用两次加密: 第一次:获取…

    Java基础面试题学习

    转换成自已的语言来回答&#xff0c;来源小林coding、沉默王二以及其它资源和自已改编。 1、概念 1、说一下Java的特点 我认为Java有很多特点 首先是平台无关性&#xff1a;Java可以实现一次编译到处运行&#xff0c;因为Java的编译器将源代码编译成字节码&#xff0c;使得该…

    【笔记】深度学习模型训练的 GPU 内存优化之旅:重计算篇

    开设此专题&#xff0c;目的一是梳理文献&#xff0c;目的二是分享知识。因为笔者读研期间的研究方向是单卡上的显存优化&#xff0c;所以最初思考的专题名称是“显存突围&#xff1a;深度学习模型训练的 GPU 内存优化之旅”&#xff0c;英文缩写是 “MLSys_GPU_Memory_Opt”。…

    AI革命!蓝耘携手海螺AI视频,打造智能化视频新纪元

    AI革命&#xff01;蓝耘携手海螺AI视频&#xff0c;打造智能化视频新纪元 前言 在这个信息爆炸的时代&#xff0c;视频已经成为我们获取信息、学习新知识的重要方式。而随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;AI与视频内容的结合为我们带来了全新的…

    Django+celery+flower

    Djangoceleryflower Django的定时任务及可视化监控Django Django的定时任务及可视化监控 Django的定时任务&#xff0c;以及可视化监控。 Django Django&#xff1b; 首先在python中新建虚拟环境并激活 pip install virtualenv python -m venv venv source venv/bin/activa…

    MapReduce处理数据流程

    &#xff08;一&#xff09;Shuffle MapReduce中的Shuffle过程指的是在Map方法执行后、Reduce方法执行前对数据进行分区排序的阶段 &#xff08;二&#xff09;处理流程 1. 首先MapReduce会将处理的数据集划分成多个split&#xff0c;split划分是逻辑上进行划分&#xff0c;…

    基于springboot的教务系统(源码+lw+部署文档+讲解),源码可白嫖!

    摘要 这些年随着Internet的迅速发展&#xff0c;我们国家和世界都已经进入了互联网大数据时代&#xff0c;计算机网络已经成为了整个社会以及经济发展的巨大动能&#xff0c;各个高校的教务工作成为了学校管理事务的重要目标和任务&#xff0c;因此运用互联网技术来提高教务的…

    潮流霓虹酸性渐变液体流体扭曲颗粒边缘模糊JPG背景图片设计素材 Organic Textures Gradients Collection

    这个系列将液体运动、霓虹灯和热浪扭曲提炼成一组有机纹理。渐变像水面上的油一样荡漾&#xff0c;模糊了科幻小说与自然之间的界限。这种未来主义的边缘&#xff0c;加上近乎生物的感觉&#xff0c;与正在进行的抽象数字超现实主义浪潮完美同步。 这套具有 20 种原始纹理和 20…

    现代时尚标签海报包装网站设计几何风PSAI无衬线英文字体安装包 Matahari Sans Font Family

    Matahari&#xff08;英语&#xff1a;Sun&#xff09;是生命的动力源泉。与日常生活的其他部分协同作用的力量和能量的象征。这是我们人类需要的最基本的东西之一&#xff0c;就像交流一样。就像 Matahari 本身一样&#xff0c;文字的力量足以维持生计。 参考怪诞字体并受到埃…