Java

【教3妹学java-JVM】9.Java中对象的创建过程是怎么样

2022-06-21  本文已影响0人  程序员小2
3妹

2哥:3妹,昨天我们已经学习了Java的内存模型,那你知道一个对象的创建过程是怎样的吗?
3妹:这个我知道,我可是个勤奋好学的好学生,昨天你给我讲过之后我又在网上查了下。
2哥:是吗, 那你给我介绍下。

讲课

对象的创建流程图:

这里借用网上的一张流程图:

创建流程

1.类加载检查

首先代码中new关键字在编译后,会生成一条字节码new指令,当虚拟机遇到一条字节码new指令时,会根据类名去方法区运行时常量池找类的符号引用,检查符号引用代表的类是否已加载,解析和初始化过。如果没有就执行相应的类加载过程。

2.分配内存

虚拟机从Java堆中分配一块大小确定的内存(因为类加载时,创建一个此类的实例对象的所需的内存大小就确定了),并且初始化为零值。内存分配的方式有指针碰撞和空闲列表两种,取决于虚拟机采用的垃圾回收期是否带有空间压缩整理的功能。

指针碰撞

如果垃圾收集器是Serial,ParNew等带有空间压缩整理的功能时,Java堆是规整的,此时通过移动内存分界点的指针,就可以分配空闲内存。

空闲列表

如果垃圾收集器是CMS这种基于清除算法的收集器时,Java堆中的空闲内存和已使用内存是相互交错的,虚拟机会维护一个列表,记录哪些可用,哪些不可用,分配时从表中找到一块足够大的空闲内存分配给实例对象,并且更新表。

3.对象初始化(虚拟机层面)

虚拟机会对对象进行必要的设置,将对象的一些信息存储在Obeject header 中。

4.对象初始化(Java程序层面)

在构造一个类的实例对象时,遵循的原则是先静后动,先父后子,先变量,后代码块,构造器。在Java程序层面会依次进行以下操作:

PS:如何解决内存分配时的多线程并发竞争问题?

内存分配不是一个线程安全的操作,在多个线程进行内存分配是,可能会存在数据不同步的问题。所以有两种方法解决:

上一篇 下一篇

猜你喜欢

热点阅读