当前位置: 首页 > article >正文

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

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

面试官: 说说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.kler.cn/a/415035.html

相关文章:

  • 查询当天每个时间点上进退场人数思路
  • vue3 + vite + antdv 项目中自定义图标
  • 微信小程序蓝牙writeBLECharacteristicValue写入数据返回成功后,实际硬件内信息查询未存储?
  • Spring Boot【二】
  • Ubuntu20.04+ROS 进行机械臂抓取仿真:环境搭建(一)
  • Windows修复SSL/TLS协议信息泄露漏洞(CVE-2016-2183) --亲测
  • 前端安全和解决方案
  • 在Android上使用MD工业相机的开发示例
  • Rust学习笔记_03——元组
  • 【大模型】基于LLaMA-Factory的模型高效微调
  • 高效赋能游戏业务:全面解析游戏托管服务的价值与实践
  • 基于Java+SpringBoot+Mysql在线简单拍卖竞价拍卖竞拍系统功能设计与实现八
  • Vue3 常用指令解析:v-bind、v-if、v-for、v-show、v-model
  • uniapp对接蓝牙
  • 二刷代码随想录第16天
  • UE5 Switch Has Authority 节点
  • AI赋能电商:打造高效销售与卓越用户体验的新引擎
  • C语言第十三周课——重点考点知识
  • python实现TCP服务端,支持对所有客户端的数据收发,支持终端自定义命令操作,提供clear命令一键断开所有的客户端连接
  • 在 Spring Boot 中实现多种方式登录(用户名、手机号、邮箱等)的不正经指南
  • Hive构建日搜索引擎日志数据分析系统
  • 将excel文件中的信息读取后批量生成word文件
  • 鸿蒙ArkUI-X已更新适配API13啦
  • ubuntu中使用ffmpeg和nginx推http hls视频流
  • 网站怎么防御https攻击
  • 基于java web的网上书店系统设计