【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 启动方式