【jvm】new对象的过程

目录

          • [1. 说明](#1. 说明)
          • [2. 类加载](#2. 类加载)
          • [3. 对象创建](#3. 对象创建)
          • [4. 返回对象引用](#4. 返回对象引用)
1. 说明
  • 1.在Java中,使用new关键字创建对象的过程是一个复杂而精细的过程,它涉及多个步骤,包括类加载、内存分配、初始化等。
2. 类加载
  • 1.加载:Java虚拟机(JVM)通过类加载器将类的字节码文件加载到内存中。类加载器会根据类的全限定名查找对应的字节码文件,并将其转换为一个Class对象。这个Class对象包含了类的结构信息,如类的成员变量、方法、构造函数等。
  • 2.验证:JVM验证加载的字节码文件是否符合Java虚拟机规范,以确保其安全性和正确性。
  • 3.准备:为类的静态变量(无final修饰)和常量(final修饰)赋默认初始值。静态变量被初始化为默认值(如int为0,boolean为false),而常量则直接赋予其初始值。
  • 4.解析:将类文件中的符号引用替换为直接引用,如类、方法的信息、文本字符串等。
  • 5.初始化:通过类的构造器进行初始化,包括执行静态代码块和给静态变量赋予正确的值。
3. 对象创建
  • 1.内存分配 :在堆内存中为对象分配一块连续的内存空间。这块空间用于存储对象的实例变量和相关信息。内存分配策略可能包括指针碰撞空闲列表两种方式,具体取决于堆内存的规整程度。
  • 2.指针碰撞:如果堆内存是绝对规整的,所有被使用过的内存都被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器。所分配内存就仅仅是把那个指针向空闲空间方向挪动一段与对象大小相等的距离。
  • 3.空闲列表:如果堆内存中的内存并不是规整的,已被使用的内存和空闲的内存相互交错在一起,JVM就必须维护一个列表,记录上哪些内存块是可用的。在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录。
  • 4.属性初始化:将对象的内存空间初始化为默认的零值。基本类型的实例变量会被初始化为对应类型的零值(例如,整型为0,布尔型为false),而引用类型的实例变量会被初始化为null。
  • 5.显示初始化:根据对象的类调用对应的构造函数,对对象进行初始化。构造函数会根据定义的参数列表执行一系列操作,例如初始化实例变量、执行其他方法等。这一步是对象定制化的过程,使得每个对象都有其独特的属性和状态。
4. 返回对象引用
  • 1.构造函数执行完毕后,JVM将对象的引用返回给使用new关键字创建对象的代码。
  • 2.后续的代码就可以通过该引用访问对象的实例变量和方法了。
相关推荐
weixin_ab11 小时前
JMM--数据原子操作
jvm
超级小忍13 小时前
JVM 中的垃圾回收算法及垃圾回收器详解
java·jvm
喝可乐的布偶猫18 小时前
Java类变量(静态变量)
java·开发语言·jvm
abigalexy20 小时前
深入JVM底层-垃圾回收GC算法
jvm
麦兜*2 天前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
真实的菜2 天前
JVM类加载系统详解:深入理解Java类的生命周期
java·开发语言·jvm
在未来等你2 天前
JVM调优实战 Day 15:云原生环境下的JVM配置
java·jvm·性能优化·虚拟机·调优
黄雪超3 天前
JVM——函数式语法糖:如何使用Function、Stream来编写函数式程序?
java·开发语言·jvm
ThetaarSofVenice3 天前
对象的finalization机制Test
java·开发语言·jvm
很小心的小新3 天前
12、jvm运行期优化
java·开发语言·jvm·笔记