
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
对象是java编程开发常用的一个元素,而今天我们就通过案例分析来了解一下,java编程开发虚拟机对象创建与访问。
1、对象创建
当虚拟机遇到一条new指令时,先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过,如果没有,则先完成类加载。在类加载检查通过后,虚拟机为对象分配内存。对象所需的内存在类加载之后就可完全确定。分配内存之后,需要执行<init>方法完成对象初始化。
2、对象内存布局
对象头、实例数据、对齐填充
对象头包括MarkWorld和指向类元数据的指针,该指针可有可无,与对象访问定位的方式有关。MarkWorld内容如下:2bits用于存储锁标志位,1bits固定为0,其他位根据锁标志位不同存储的内容也不同。
存储内容标志位状态对象hash码、分代年龄01未锁定指向锁记录的指针00轻量级锁定指向重量级锁的指针10膨胀(重量级锁定)空,不需要记录信息11GC标记偏向线程ID、偏向时间戳、对象分代年龄10可偏向
实例数据:包括父类和子类的实例数据,占有相同字节数据的类型的数据存放在一起,在此基础上,父类数据在子类之前。
对齐填充:HotSpot中规定对象的起始地址是8字节的整数倍,也就要求每个对象占用的内存大小是8字节的整数倍,所以才有对齐填充。
3、对象访问定位
句柄:栈上的引用是句柄池中的一个句柄的地址,句柄存储对象的地址和对象类信息的地址,需要经过两次寻址才能找到对象,所以速度相对慢一些,还需要维护句柄池。但是当对象地址改变时只需要修改句柄里的地址信息,所有引用该对象的地方都不需要修改。
直接指针:栈上的引用就是对象的内存地址,只需要一次寻址就可以找到对象,速度相对快一些,但是当对象地址改变时需要将所有引用都修改。
助力2021高薪就业,Java实战项目来袭!林森老师带你重温经典,从Java角度解析坦克大战游戏~教你用键盘监控事件控制坦克移动、子弹发射等!原价499元,限时9.9元购买,邀请好友学习还可获得现金红包!上不封顶~
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。