高级java每日一道面试题-2024年11月25日-JVM篇-说说Java对象创建过程?

devtools/2024/11/27 17:02:43/

如果有遗漏,评论区告诉我进行补充

面试官: 说说Java对象创建过程?

我回答:

在Java高级面试中,Java对象的创建过程是一个常被提及的重要话题。以下是对Java对象创建过程的详细解析:

一、Java对象创建的基本步骤

  1. 检查类是否加载

    • 当需要创建一个类的实例对象时,JVM首先会检查这个类是否已经被加载、解析和初始化。
    • 如果类还没有被加载,JVM会先执行类的加载流程,将类的信息从磁盘加载到内存中,并创建对应的Class对象。
  2. 分配内存

    • 类加载成功后,JVM就能够确定对象的大小,并在堆内存中划分一块对象大小的内存空间出来,分配给新生对象。
    • 内存分配方式主要有两种:指针碰撞法和空闲列表法。指针碰撞法适用于内存规整的情况,而空闲列表法适用于内存不规整的情况。
      • 指针碰撞(Bump the Pointer):适用于单线程场景,JVM维护一个指针,每次分配内存时,指针向前移动相应的字节数。
      • 空闲列表(Free List):适用于多线程场景,JVM维护一个列表,记录哪些内存块是可用的,每次分配内存时从列表中选择合适的内存块。
    • 针对内存分配时存在的线程安全问题,JVM采用了CAS+重试机制和TLAB(Thread Local Allocation Buffer)来处理。
  3. 初始化零值

    • 内存分配完成后,JVM会对分配到的内存空间(实例数据区)进行初始化零值操作。
    • 即为对象的实例成员变量赋予零值,如int类型赋值为0,浮点型字段初始化为0.0,引用类型赋值为null等。
  4. 设置对象头

    • 初始化零值完成后,JVM会对对象进行必要的设置,如对象的类信息、哈希码、GC分代年龄等。
    • 这些信息会存放在对象的对象头中。对象头包括Mark Word和元数据区,哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳、如果是数组对象,还有记录数组长度的区域。
  5. 执行方法

    • 在内存分配和初始化零值之后,JVM会调用对象的构造函数,执行构造函数中的代码,完成对象的初始化。构造函数可以执行一些自定义的初始化操作,如设置成员变量的值、调用其他方法等。
    • 该方法由实例成员变量声明、实例初始化块和构造方法组成。
    • JVM会按照代码顺序执行这些操作,完成对象的初始化。

二、Java对象创建的详细过程

  1. 类的加载

    • 类的加载是Java对象创建的前提。加载过程包括:
      • 通过一个类的全限定名来获取其定义的二进制字节流。
      • 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
      • 在堆中生成一个代表这个类的Class对象,作为方法区中这些数据的访问入口。
    • 类的加载过程还包括验证、准备、解析和初始化等阶段。
  2. 实例变量的分配和初始化

    • 在类加载完成后,JVM会在堆内存中为对象分配内存空间。
    • 分配完内存后,JVM会为对象的实例变量分配空间,并赋予默认值(零值)。
    • 然后,JVM会根据程序员的编码对实例变量进行初始化,包括执行对实例变量直接赋值和执行实例代码块等操作。
  3. 执行构造方法

    • 在对象的实例变量初始化完成后,JVM会执行对象的构造方法。
    • 构造方法是用来初始化对象状态的特殊方法,在对象创建时由JVM自动调用。
    • 构造方法中可以包含对实例变量的进一步赋值、初始化代码块等。

三、Java对象创建的多种方式

  1. 使用new关键字

    • 这是最常见的创建对象的方式。通过new关键字调用类的构造方法来创建对象。
  2. 使用反射机制

    • 通过Class类的newInstance方法或Constructor类的newInstance方法来创建对象。
    • 这种方式可以动态地创建对象,而不需要在编译时知道具体的类名。
  3. 使用clone方法

    • 通过调用对象的clone方法来创建对象的副本。
    • 使用clone方法需要实现Cloneable接口,并覆盖clone方法。
    • clone方法不会调用任何构造函数。
  4. 使用反序列化

    • 通过反序列化一个序列化对象来创建新的对象。
    • 使用反序列化需要实现Serializable接口。
    • 反序列化过程不会调用任何构造函数。

综上所述,Java对象的创建过程是一个复杂而精细的过程,涉及类的加载、内存分配、初始化零值设置对象头和执行方法等多个步骤。理解并掌握这些步骤对于深入理解Java内存管理和优化Java程序性能具有重要意义。

总结

综上所述,Java对象的创建过程是一个复杂而精细的过程,涉及类加载检查、内存分配、初始化零值设置对象头执行构造函数和返回对象引用。理解这些步骤有助于深入掌握Java对象的生命周期和内存管理机制。


http://www.ppmy.cn/devtools/137443.html

相关文章

Linux 服务器安装 Docker - CentOS 9 (Stream)

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🍃 vue-uniapp-template 🌺 仓库主页: GitCode💫 Gitee &#x1f…

GitHub 和 GitLab

GitHub 和 GitLab 的概念 1. GitHub 定义:GitHub 是一个基于 Git 的版本控制和协作平台,专注于开源项目和开发者社区。主要功能: 托管代码仓库,支持 Git 协作。提供 Pull Request、代码审查和协作工具。拥有庞大的开源社区&…

[网鼎杯 2020 朱雀组]phpweb 详细题解(反序列化绕过命令执行)

知识点: call_user_func() 函数 反序列化魔术方法 find命令查找flag 代码审计 打开题目,弹出上面的提示,是一个警告warning,而且页面每隔几秒就会刷新一次,根据warning中的信息以及信息中的时间一直在变,可以猜测是date()函数一直在被调用 查看源代码发现一些信息,但是作用…

现代密码学

概论 计算机安全的最核心三个关键目标(指标)/为:保密性 Confidentiality、完整性 Integrity、可用性 Availability ,三者称为 CIA三元组 数据保密性:确保隐私或是秘密信息不向非授权者泄漏,也不被非授权者使…

HalconDotNet 实现颜色空间转换

文章目录 一、RGB 转 HSV 颜色空间转换二、HSV 转 RGB 颜色空间转换三、RGB 转灰度颜色空间转换四、LAB 颜色空间转换(RGB 转 LAB)五、YCbCr 颜色空间转换(RGB 转 YCbCr)一、RGB 转 HSV 颜色空间转换 RGB(红、绿、蓝)颜色模型是最常见的颜色表示方式,而 HSV(色调、饱和…

【linux】线程概念与控制

🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 线程基本概念 🦋 1-1 什么是线程🦋 1-2 分⻚式存储管理1-2-1 虚拟地址和⻚表的由来1-2-2 ⻚表1-2-3 ⻚⽬录结构1-2-4 两级⻚表的地…

【小白学机器学习36】关于独立概率,联合概率,交叉概率,交叉概率和,总概率等 概念辨析的例子

目录 1 先说结论 2 联合概率 3 边缘概率 4 (行/列)边缘概率的和 总概率1 5 条件概率 5.1 条件概率的除法公式 5.2 条件概率和联合概率区别 1 先说结论 关于独立概率,联合概率,交叉概率,交叉概率和,总概率 类型含义 …

MySQL INSERT CRTATE DELETE DORP UPDATE WHERE 的用法

MySQL INSERT CRTATE DELETE DORP UPDATE WHERE 的用法 -- 创建数据库 CREATE DATABASE example_db;-- 使用数据库 USE example_db;-- 创建表 CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100),position VARCHAR(50),salary DECIMAL(10, 2) );…