Java中对象的创建过程是怎么样的?

3 个回答

  • 周小凤
    时间不在乎你拥有多少,而在于你怎样使用。
    当 JVM 遇到一条新建对象的指令时,创建对象的过程如下: 1. **检查类的符号引用** - JVM 首先检查指令的参数是否能在常量池中定位到一个类的符号引用。 - 如果该类未被加载,则进行类的加载过程。 2. **为对象分配内存** - **指针碰撞(Bump-the-pointer)**:如果堆中的内存是规整的,所有已使用内存放在一边,未使用内存放在另一边,中间有一个指针作为分界点。分配内存时,只需将指针向空闲空间方向移动相应的距离。 - **空闲列表(Free list)**:如果堆中的内存不是规整的,已使用和未使用的内存交织在一起,需要维护一个空闲列表,记录哪些内存块是可用的。分配内存时,从空闲列表中找到一块足够大的内存分配给对象。 - **本地线程缓冲分配(Thread Local Allocation Buffer,TLAB)**:为了减少线程争用,提高分配效率,JVM 为每个线程预分配一小块内存,当线程需要分配对象时,优先从 TLAB 中分配。 3. **初始化对象内存** - 将除对象头外的对象内存空间初始化为 0。这一过程确保对象的实例字段具有默认值。 4. **设置对象头** - 对对象头进行必要的设置,包括对象的哈希码、GC 分代年龄、类型指针(指向类元数据的指针),以及锁信息(如果对象需要同步)。 经过以上步骤,JVM 完成了对象的创建。此时,新的对象已经在堆内存中分配,并且其内存空间已经被正确初始化,可以被使用。
    发布于 2024-04-02 15:02 •IP属地 内蒙古
    举报
    评论
    收藏

  • java蚂蚁
    慢慢理解世界,慢慢更新自己。
    Java创建对象的过程可以简述为以下步骤: 1. **检查类加载**:虚拟机会检查类的符号引用,确保类已经加载、解析并初始化。如果类还没有被加载,则会先执行类的加载过程。 2. **分配内存**:通过类加载后的类模板,虚拟机在堆中为对象分配内存。 3. **设置默认值**:分配内存后,所有成员变量会被初始化为默认值(如数值类型为 0,引用类型为 `null`)。 4. **设置对象头**:为对象设置头信息,包括对象的哈希码、GC 信息、锁状态及指向类的元数据等。 5. **执行构造方法**:调用 `init` 方法,初始化成员变量,执行实例初始化代码块,调用构造函数,完成对象的实例化。 6. **返回引用**:最终将新创建对象的内存地址赋值给引用变量。
    发布于 2022-07-08 10:12 •IP属地 江苏
    举报
    评论
    收藏

  • 美啦美啦美啦
    不要在赚钱的路上把健康丢了,要在健康的路上顺便把钱赚了。
    这是网上看到的一张流程图: ![image.png](https://images.codewd.com/c3f5602e5834a29af30134add785de03.png) ### 1.类加载检查 首先代码中new关键字在编译后,会生成一条字节码new指令,当虚拟机遇到一条字节码new指令时,会根据类名去方法区运行时常量池找类的符号引用,检查符号引用代表的类是否已加载,解析和初始化过。如果没有就执行相应的类加载过程。 ### 2.分配内存 虚拟机从Java堆中分配一块大小确定的内存(因为类加载时,创建一个此类的实例对象的所需的内存大小就确定了),并且初始化为零值。内存分配的方式有指针碰撞和空闲列表两种,取决于虚拟机采用的垃圾回收期是否带有空间压缩整理的功能。 #### 指针碰撞 如果垃圾收集器是Serial,ParNew等带有空间压缩整理的功能时,Java堆是规整的,此时通过移动内存分界点的指针,就可以分配空闲内存。 #### 空闲列表 如果垃圾收集器是CMS这种基于清除算法的收集器时,Java堆中的空闲内存和已使用内存是相互交错的,虚拟机会维护一个列表,记录哪些可用,哪些不可用,分配时从表中找到一块足够大的空闲内存分配给实例对象,并且更新表。 ### 3.对象初始化(虚拟机层面) 虚拟机会对对象进行必要的设置,将对象的一些信息存储在Obeject header 中。 ### 4.对象初始化(Java程序层面) 在构造一个类的实例对象时,遵循的原则是先静后动,先父后子,先变量,后代码块,构造器。在Java程序层面会依次进行以下操作: ``` 初始化父类的静态变量(如果是首次使用此类) 初始化子类的静态变量(如果是首次使用此类) 执行父类的静态代码块(如果是首次使用此类) 执行子类的静态代码块(如果是首次使用此类) 初始化父类的实例变量 初始化子类的实例变量 执行父类的普通代码块 执行子类的普通代码块 执行父类的构造器 执行子类的构造器 ```
    发布于 2022-02-23 10:08 •IP属地 湖南
    举报
    评论
    收藏