JVM中对象创建过程

手机软件开发 2024-9-16 20:27:07 90 0 来自 中国
1.类加载查抄

假造时机到一条 new 指令时,首先查抄这个指令的参数常量池中找到一个类符号引用,而且查抄这个符号引用代表的类是否已经被加载,分析,初始化过。如果没有必须先实验类的加载初始化过程。
2.分配内存

在类加载查抄通过后,接着就可以为新生对象分别内存了,对象占用内存的巨细在类加载后就可以完全确定。为对象分配内存空间就相称于把一块确定巨细的内存从java堆中分别出来。
2.1怎样分别内存呢
高并发的场景下怎样保证同一块空间不会分给两个对象的呢?
指针碰撞 Bump the pointer

如果假造机堆中内存是绝对规整的,用过和没用过的各占一块完备的内存,中心放着一个指针作为分界点的指示器,在举行内存分配时,只需把指针向空闲地域移动一段间隔,以放下新对象。
空闲列表 Free List

3.png 如果假造机堆中的内存不是规整的,用过的和没有效过的相互交织,就没有办法利用指针碰撞的方法;了。假造机必须维护一个列表,来记录队中有哪些地域是空闲的。在分配内存的时间找到一块富足大的空间分配给对象,并更新列表记录。
办理并发

分配对象在堆上,堆是线程共享的,多个线程大概同时会在一块内存上举行初始对象,造成背面线程将对象覆盖标题,这里会有多线程并发安全标题。假造机接纳CAS配上失败重试的方式保证更新利用的原子性来对分配内存空间的动作举行同步处置处罚。
当地线程分配缓冲(Thread Local Allocation Buffer TLAB)

每个线程预先在jvm堆中分配一块内存空间,线程声明周期内的对象分配都在这实现分配的空间中举行
3.内存空间初始化

内存分配完成后,假造机必要将分配到的内存空间都初始化为零值,这一步利用保证了对象的实例字段在java代码中可以不赋初始值就能直接利用。
4.设置对象头


在HotSpot假造机中,对象在内存中分布可以又3各部门祖成,对象头,实例数据,对齐添补。
4.1自身的运行数据(Mark word)

哈希码
GC分代年龄
锁状态标识
线程持有锁
方向锁ID
方向时间戳等
4.2范例指针

对象在方法区中对应类的指针,假造机通过这个指针来确定这个对象是哪个类的实例。
实例数据

存放对象的现实数据。
对齐添补

非必须得,也没有特别的寄义,只是起着占位符的作用。
5.实验init方法

实验<init> 方法,就是按照步调员的意愿举行初始化,对应到语言层面上就是为属性赋值,和实验构造方法
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-22 17:14, Processed in 0.148376 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表