JVM创建对象,你了解几个步骤

简介: JVM创建对象的过程包括五个主要步骤:1. 类加载检查,确保类已加载并验证其合法性;2. 内存分配,根据对象大小和堆内存情况分配空间,必要时触发垃圾回收;3. 初始化零值,为基本数据类型和引用类型设置初始值;4. 设置对象头,记录对象的类型信息和GC相关数据;5. 执行init方法,调用构造函数完成对象的初始化。掌握这些步骤有助于深入理解JAVA虚拟机的工作原理,并在技术面试中展示技术实力。

JVM创建对象的步骤的话题,在技术面试中经常被提到。不仅可以帮助我们更深入的理解JAVA虚拟机的工作原理,还能在面试中秀出我们的技术功底。


1.类加载检查

我们在代码中使用到某个类时,JVM需要先检查该类是否已经加载内存中,如果没有,JVM会通过类加载器去加载这个类,这个过程称为类加载检查,类检查的主要任务是确保所需的内在内存中可用,这是程序正常运行的前提。


类加载检查还包括对内的合法性进行检查,比如检查类的魔术、版本号等信息,以确保类文件的完整性和正确性,此外类检查还会检查类是否已经被加载过,以避免重复加载提高运行效率。分配内存一旦类加载检查通过,JVM需要在堆内存中对对象分配内存空间,这个过程需要考虑到对象的大小以及堆内存的可用空间。


2.内存分配

在进行内存分配时,JVM会根据对象的大小来决定在堆内存中分配多少空间,如果对象比较小,JVM会选择使用快速分配策略。


例如指针碰撞或者空闲列表,指针碰撞是一种简单的列存分配方式,他将对堆内存一分为二,一边用于以分配对象,另一边用于未分配对象,通过移动指针来实现内存分配,而空闲列表则将对堆内存划分为一系列大小不等的内存块,通过为护一个空隙列表记录可用的内存块,当需要分配内存时,从空闲列表中选择和小的内存块进行分配。


除了考虑对象大小外,JVM还需要考虑堆内存的可用空间,如果堆内存的可用空间不足以容纳对象,就会触发垃圾回收机器来释放一些无用的对象,已腾出足够的空间来分配新对象。


垃圾回收的具体策略和算法在不同的JVM实现中可能会有所不同,但其核心目标都是为了确保对堆内存的可用空间。


3.初始化零值

初始化零值,在内存分配完成后JVM会对对象的内存空间进行初始化,对于基本数据类型JVM会将其初始化为零值。例如,整形初始化为0,浮点型会被初始化为0.0,布尔型会被初始化为false,引用类型会被初始化为null,这样做的目的是为了确保对象的属性在使用之前都有一个明确的初始值,避免了因为未初始化而导致个程序错误。


在初始化零值的过程中,JVM会根据对象的类型和属性来逐个初始化对象的各个属性值,如果属性基本类型初始值是对应数据类型的零值,如果属性是引用类型,那么它的初始值null,通过这样的初始化过程,我们可以确保对象的各个属性都处于一个可控的状态,为后续的操作打下了良好的基础。


4.设置对象头

设置对象头,在内存分配和初始化零值完成后,JVM会在内存中为对象设置对象头,对象头是对象在内存中的标识符,包含一些必要的信息,例如对象的类型信息、GC相关信息等。


首先对象头会包含对象的类型信息,这个信息是类加载的时候确定的,它指示了对象所属的那个类型。这样JVM在操作对象的时候,可以根据对象中的类型信息来准确的调用对象的方法和属性,其次对象头还包含了GC相关的信息,比如对象的引用计数、对象的分代信息等,这些信息对于JVM的垃圾回收机制非常重要,他们能够帮助JVM正确的管理内存,及时回收使用的对象,避免内存泄露内存的问题。


除此之外,对象头还可能包含一些额外的信息,比如对象的哈希码、锁状态等。这些信息虽然不是必须的,但他们可以为对象提供额外的功能和特性,例如在多线程环境下,锁状态信息可以帮助JVM实现线程同步。


5.执行init方法

最后一步是执行对象的init方法。在JAVA中每个类都有一个与对应的构造方法,在对象创建的时候,JVM会调用该构造方法来初始化对象,这个过程就是执行init方法。


init方法主要作用是完成对象的初始化工作,包括对对象的属性进行赋值赋值、调用其他方法进行一些初始化操作等。在执行init方法之前JVM会为对象分配内存,初始化零值,设置对象头等操作,确保对象处于一个合法且可用的状态。在执行init方法的过程中,我们可以在构造方法中编写一些初始化逻辑,比如对对象的属性进行初始化,调用其他方法进行初始化操作等,这样当我们使用关键字创建对象的时候JVM就会按照我们定义的初始化逻辑来初始化对象,确保对象在创建之后处于一个正确的状态。


通过以上五个步骤,JVM成功创建了一个对象,当我们使用new关键字,创建一个对象的时候,其实就是在触发了JVM的这个创建对象的过程。了解这个过程不仅可以帮助我们更好的理解JAVA程序的执行流程,还能够在技术面试中体现我们的技术功底。希望通过今天的分享,大家对于JVM创建过程有了更深入的了解。

相关文章
|
5天前
|
调度 云计算 芯片
云超算技术跃进,阿里云牵头制定我国首个云超算国家标准
近日,由阿里云联合中国电子技术标准化研究院主导制定的首个云超算国家标准已完成报批,不久后将正式批准发布。标准规定了云超算服务涉及的云计算基础资源、资源管理、运行和调度等方面的技术要求,为云超算服务产品的设计、实现、应用和选型提供指导,为云超算在HPC应用和用户的大范围采用奠定了基础。
179564 18
|
12天前
|
存储 运维 安全
云上金融量化策略回测方案与最佳实践
2024年11月29日,阿里云在上海举办金融量化策略回测Workshop,汇聚多位行业专家,围绕量化投资的最佳实践、数据隐私安全、量化策略回测方案等议题进行深入探讨。活动特别设计了动手实践环节,帮助参会者亲身体验阿里云产品功能,涵盖EHPC量化回测和Argo Workflows量化回测两大主题,旨在提升量化投研效率与安全性。
云上金融量化策略回测方案与最佳实践
|
14天前
|
人工智能 自然语言处理 前端开发
从0开始打造一款APP:前端+搭建本机服务,定制暖冬卫衣先到先得
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。
9176 23
|
18天前
|
Cloud Native Apache 流计算
资料合集|Flink Forward Asia 2024 上海站
Apache Flink 年度技术盛会聚焦“回顾过去,展望未来”,涵盖流式湖仓、流批一体、Data+AI 等八大核心议题,近百家厂商参与,深入探讨前沿技术发展。小松鼠为大家整理了 FFA 2024 演讲 PPT ,可在线阅读和下载。
4876 12
资料合集|Flink Forward Asia 2024 上海站
|
18天前
|
自然语言处理 数据可视化 API
Qwen系列模型+GraphRAG/LightRAG/Kotaemon从0开始构建中医方剂大模型知识图谱问答
本文详细记录了作者在短时间内尝试构建中医药知识图谱的过程,涵盖了GraphRAG、LightRAG和Kotaemon三种图RAG架构的对比与应用。通过实际操作,作者不仅展示了如何利用这些工具构建知识图谱,还指出了每种工具的优势和局限性。尽管初步构建的知识图谱在数据处理、实体识别和关系抽取等方面存在不足,但为后续的优化和改进提供了宝贵的经验和方向。此外,文章强调了知识图谱构建不仅仅是技术问题,还需要深入整合领域知识和满足用户需求,体现了跨学科合作的重要性。
|
26天前
|
人工智能 自动驾驶 大数据
预告 | 阿里云邀您参加2024中国生成式AI大会上海站,马上报名
大会以“智能跃进 创造无限”为主题,设置主会场峰会、分会场研讨会及展览区,聚焦大模型、AI Infra等热点议题。阿里云智算集群产品解决方案负责人丛培岩将出席并发表《高性能智算集群设计思考与实践》主题演讲。观众报名现已开放。
|
13天前
|
人工智能 容器
三句话开发一个刮刮乐小游戏!暖ta一整个冬天!
本文介绍了如何利用千问开发一款情侣刮刮乐小游戏,通过三步简单指令实现从单个功能到整体框架,再到多端优化的过程,旨在为生活增添乐趣,促进情感交流。在线体验地址已提供,鼓励读者动手尝试,探索编程与AI结合的无限可能。
三句话开发一个刮刮乐小游戏!暖ta一整个冬天!
|
13天前
|
消息中间件 人工智能 运维
12月更文特别场——寻找用云高手,分享云&AI实践
我们寻找你,用云高手,欢迎分享你的真知灼见!
1015 67