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创建过程有了更深入的了解。

相关文章
|
6月前
|
Arthas 监控 Java
JVM内存问题之使用gperftools分析JNI Memory泄漏的具体步骤是什么
JVM内存问题之使用gperftools分析JNI Memory泄漏的具体步骤是什么
147 2
|
设计模式 Java
【JVM】Java对象创建的流程步骤
【JVM】Java对象创建的流程步骤
228 0
|
2月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
428 1
|
3月前
|
存储 安全 Java
jvm 锁的 膨胀过程?锁内存怎么变化的
【10月更文挑战第3天】在Java虚拟机(JVM)中,`synchronized`关键字用于实现同步,确保多个线程在访问共享资源时的一致性和线程安全。JVM对`synchronized`进行了优化,以适应不同的竞争场景,这种优化主要体现在锁的膨胀过程,即从偏向锁到轻量级锁,再到重量级锁的转变。下面我们将详细介绍这一过程以及锁在内存中的变化。
49 4
|
16天前
|
存储 Java 程序员
【JVM】——JVM运行机制、类加载机制、内存划分
JVM运行机制,堆栈,程序计数器,元数据区,JVM加载机制,双亲委派模型
|
1月前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
2月前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
2月前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
27 3
|
2月前
|
存储 缓存 监控
Elasticsearch集群JVM调优堆外内存
Elasticsearch集群JVM调优堆外内存
59 1
|
2月前
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。