【JVM】总结篇之对象内存布局 执行引擎

文章目录

对象内存布局

对象的实例化

new对象流程?(龙湖地产)

对象创建方法,对象的内存分配。(360安全)

1.判断对象对应的类是否加载、链接、初始化

虚拟机遇到一条new指令,首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化。(即判断类元信息是否存在)。

如果没有,那么在双亲委派模式下,使用当前类加载器以ClassLoader+包名+类名为Key进行查找对应的.class 文件。

如果没有找到文件,则抛出ClassNotFoundException 异常。

如果找到,则进行类加载,并生成对应的Class类对象。

2.为对象分配内存

内存规整->指针碰撞

内存不规整->空闲列表

3.处理并发安全问题

CAS ( Compare And Swap )失败重试、区域加锁:保证指针更新操作的原子性;

TLAB 把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存,称为本地线程分配缓冲区,(TLAB ,Thread Local Allocation Buffer)虚拟机是否使用TLAB,可以通过-XX:+/-UseTLAB参数来设定。

4.初始化分配到的空间

内存分配结束,虚拟机将分配到的内存空间都初始化为零值(不包括对象头)。

5.设置对象的对象头

将对象的所属类(即类的元数据信息)、对象的HashCode和对象的GC信息、锁信息等数据存储在对象的对象头中。这个过程的具体设置方式取决于JVM实现。

6.执行init方法进行初始化

初始化成员变量,执行实例化代码块,调用类的构造方法,并把堆内对象的首地址赋值给引用变量。

对象的内存布局


对象头

实例数据

对齐填充

对象的方问定位


HotSpot这里主要使用第2种方式:直接指针访问

执行引擎

HotSpot JVM 启动方式


相关推荐
m0_706653232 小时前
Python生成器(Generator)与Yield关键字:惰性求值之美
jvm·数据库·python
qq_423233902 小时前
实战:用Python开发一个简单的区块链
jvm·数据库·python
编程(变成)小辣鸡3 小时前
JVM、JRE和JDK 的关系
java·开发语言·jvm
hello 早上好3 小时前
02_JVM 架构模型中“栈式”与“寄存器式”指令集架构
jvm·架构
青槿吖4 小时前
【趣味图解】线程同步与通讯:从抢奶茶看透synchronized、ReentrantLock和wait/notify
java·开发语言·jvm·算法
难得的我们5 小时前
如何为开源Python项目做贡献?
jvm·数据库·python
焦糖玛奇朵婷5 小时前
就医陪诊小程序|从软件开发视角看实用度✨
java·大数据·jvm·算法·小程序
岳轩子5 小时前
jvm学习 引入 第一晚
jvm·学习
licheng99675 小时前
工具、测试与部署
jvm·数据库·python
Tansmjs6 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python