当前位置:网站首页>JVM之对象创建过程
JVM之对象创建过程
2022-06-11 20:54:00 【只是六号z】
Java 对象的创建过程(五步)
1.类加载检查
虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程。
2.分配内存
在类加载检查完成后,虚拟机为new出来的对象分配内存。
新对象需要的内存大小在类加载完成后就已经确定,现在要做的是吧一块确定大小的内存从Java堆中划分出来。
分配方式有两种:指针碰撞和空闲列表。
如果内存空间规整
如果内存是规整的,那么虚拟机将采用的是指针碰撞法(Bump The Pointer)来为对象分配内存。意思就是所有用过的内存在一边,空闲的内存在一边,中间放着一个指针作为分界点的指示器,分配内存就仅仅是把指针向空闲那边挪动一段与对象大小相等的举例罢了。如果垃圾收集器先择的是Serial、ParNew这种基于压缩算法的,虚拟机采用这种分配方式,一般使用带有compact(整理)过程的收集器时,使用指针碰撞。
如果内存不规整
如果内存不是规整的,已使用的内存和未使用的内存相互交错,那么虚拟机采用的时空闲列表法来为对象分配内存。意思是虚拟机维护了一个列表,记录上那些内存块是可以使用的,再分配的时候从列表中找到一块足够大的空间划分给队形实例,并更新列表上的内容。这种分配方式成为“空闲列表(Free List)”。
选择哪种分配方式由Java堆是否规整决定,而Java堆是否规整又有所采用的垃圾收集器是否带有压缩整理功能而决定。
补充:内存分配并发问题
创建对象的时候有一个很重要的问题,就是线程安全,在实际开发中,创建对象是很频繁的事情,作为虚拟机来说,必须要保证线程安全。
CAS + 失败重试
CAS是乐观锁的一种实现方式。每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。
虚拟机采用CAS配上失败重试的方式保证更新操作的原子性。
TLAB
为每个线程预先在Eden区分配一块内存,JVM在给线程中的对象分配内存时,首先在TLAB分配,当对象大于TLAB中的剩余内存或者TLAB的内存已用尽时,再采用上述的CAS进行分配。
3.初始化零值
内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值(不包括对象头),这一步操作保证了对象的实例字段在 Java 代码中可以不赋初始值就直接使用,程序能访问到这些字段的数据类型所对应的零值。
4.设置对象头
虚拟机要对对象进行必要的设置,例如这个对象是那个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。 这些信息存放在对象头中。 另外,根据虚拟机当前运行状态的不同,如是否启用偏向锁等,对象头会有不同的设置方式。
5.执行init方法
在Java程序的视角来看,初始化才正式开始。初始化成员变量,执行实例化代码块,调用类的构造方法,并把堆内对象的首地址赋值给引用变量。
边栏推荐
- Deploy website traffic statistics background based on Tencent cloud lightweight application server and umami
- Using the flask framework to write the bezel
- Explanation of each column output by explain statement
- Yintai department store and Taobao tmall jointly create a green fashion show to help "carbon neutrality"
- UDP、TCP
- Lr-link Lianrui makes its debut at the digital Expo with new products - helping the construction of new infrastructure data center
- 2022-2028 global and Chinese thermocouple sensor market status and future development trend
- Work assessment of spectral analysis of Jilin University in March of the 22nd spring -00079
- 10 R vector operation construction
- var 和 let的区别_let 和 var的区别
猜你喜欢

Redis第四话 -- redis高性能原理(多路复用)和高可用分析(备份、主从)
Recompile kubeadm to solve the problem of certificate expiration in one year

Object storage of CEPH distributed storage

28. JS implementation mechanism

The official announced the launch of Alibaba's 2023 global school recruitment: Technical Posts account for more than 60%

moderlarts第一次培訓

第二部分 数据链路层

Première formation sur les largeurs modernes

Explanation of each column output by explain statement

新品发布:国产单电口千兆网卡正式量产!
随机推荐
[file upload vulnerability 04] server side mime detection and bypass experiment (based on upload-labs-2 shooting range)
Wechat applet | rotation chart
2022-2028 current situation and future development trend of global and Chinese thermocouple belt Market
Oracle case: ora-00600: internal error code, arguments: [4187]
In idea, run the yarn command to show that the file cannot be loaded because running scripts is disabled on this system
Work assessment of spectral analysis of Jilin University in March of the 22nd spring -00079
修改本地微信小程序的AppID
Technical exchange | why should network security equipment use bypass function
Docker installing MySQL
New product release: domestic single port Gigabit network card is officially mass produced!
Serval and Rooted Tree(CF1153D)-DP
第一部分 物理层
[data visualization] use Apache superset to visualize Clickhouse data
Final examination of theory and practice of socialism with Chinese characteristics 1
Product information | Poe network card family makes a collective appearance, the perfect partner of machine vision!
Role of RESNET residual block
【博弈论-绪论】
Wechat applet Bluetooth development
UDP、TCP
【数据可视化】Apache Superset 1.2.0教程 (三)—— 图表功能详解