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

相关文章
|
Arthas 监控 Java
JVM内存问题之使用gperftools分析JNI Memory泄漏的具体步骤是什么
JVM内存问题之使用gperftools分析JNI Memory泄漏的具体步骤是什么
330 2
|
设计模式 Java
【JVM】Java对象创建的流程步骤
【JVM】Java对象创建的流程步骤
291 0
|
5月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
469 55
|
6月前
|
Arthas 监控 Java
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
446 6
|
9月前
|
存储 设计模式 监控
快速定位并优化CPU 与 JVM 内存性能瓶颈
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
915 166
|
11月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
1792 1
|
7月前
|
存储 缓存 算法
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
319 29
JVM简介—1.Java内存区域
|
7月前
|
缓存 监控 算法
JVM简介—2.垃圾回收器和内存分配策略
本文介绍了Java垃圾回收机制的多个方面,包括垃圾回收概述、对象存活判断、引用类型介绍、垃圾收集算法、垃圾收集器设计、具体垃圾回收器详情、Stop The World现象、内存分配与回收策略、新生代配置演示、内存泄漏和溢出问题以及JDK提供的相关工具。
JVM简介—2.垃圾回收器和内存分配策略
|
7月前
|
存储 设计模式 监控
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
166 0
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
|
8月前
|
存储 算法 Java
JVM: 内存、类与垃圾
分代收集算法将内存分为新生代和老年代,分别使用不同的垃圾回收算法。新生代对象使用复制算法,老年代对象使用标记-清除或标记-整理算法。
102 6