Day335.对象的实例化内存布局与访问定位直接内存 -JVM
Posted 阿昌喜欢吃黄桃
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day335.对象的实例化内存布局与访问定位直接内存 -JVM相关的知识,希望对你有一定的参考价值。
对象的实例化、内存布局与访问定位
一、对象的实例化
1、创建对象的方式
2、创建对象的步骤
- 字节码角度
public class test(){
pulbic static void main(String[] agrs){
Object obj = new Object();
}
}
1、根据类元信息,加载对应的类信息
2、为对象分配堆中空间
3、处理并发问题,Cas原子操作,每个线程独立对应堆的TLAB空间
4、为对象属性进行零值初始化赋值,布尔型为false,int为0等。。。
5、设置对象的对象头,记录对象的一系列信息
6、执行对象定义的构造器初始化、代码块初始化、显式初始化
二、堆空间中的对象的内存布局
1、对象头
2、实例数据
3、对齐填充
4、图示
三、对象的访问定位
为什么在栈帧中的引用就能找到堆空间里面的对象实例和找到对应方法区的类元信息等呢???
通过栈上引用
- 对象访问方式的两种方式
- 句柄访问
- 直接指针(Hotspot采用)
创建对象的目的:使用他
1、引用图示
2、句柄访问方式图
在堆空间中开启了一个区域,句柄池
-
一个对象对应这一个句柄
-
句柄里面包含了:
- 指向对象实例数据的指针
- 指向方法区对象类型数据的指针
-
效率比较低
,需要3次寻址,需要为句柄池开启内存空间 -
栈空间
引用地址稳定
,如果对象实例数据地址发现改变,那栈的引用不需要修改引用,只需要一直指向句柄池的即可
3、直接指针
效率高
,直接通过引用寻找,一步到位- 对应上面的优点,这里就
地址稳定性差
栈空间局部变量表中直接有一个引用,直接指向堆空间对象实例数据,堆空间对象实例数据里面又有一个指向对象类型数据的指针
直接内存
- NIO
以上是关于Day335.对象的实例化内存布局与访问定位直接内存 -JVM的主要内容,如果未能解决你的问题,请参考以下文章