创建对象时,jvm会找到对应的,jvm问题定位
java基础教程栏目介绍JVM创建对象及访问定位的过程
如何解决写爬虫IP受阻的问题?立即使用。
1、对象的创建
当虚拟机接收到新指令时,它检查该指令是否可以在常量池中定位类的符号引用,以及由该符号引用表示的类是否已经被加载、解析和初始化。如果没有,首先执行类加载过程。类加载后,虚拟机为新对象分配内存(从Java堆中划分一定大小的内存),内存大小完全可以在类加载后确定。两种分配方法:(1):指针碰撞:假设Java堆中的内存是绝对规律的,即使使用的内存在一边,空闲的内存在另一边,在中间放一个指针作为指示器,通过移动指针来实现内存分配。(2):空闲列表:如果Java堆中的内存不规则,即已用内存和空闲内存相互交错,虚拟机必须维护一个列表,记录哪些内存块可用,通过从列表中寻找空间并划分为对象实例来分配内存。Java堆是否规则取决于使用的垃圾收集器是否具有压缩和合并的功能。在虚拟机中创建对象不是线程安全的行为。它可能发生在给对象A分配内存的时候,在指针可以被修改之前,对象B使用原来的指针分配内存。有两种解决方案:(1)同步内存空间分配。实际上,虚拟机采用CAS和失败重试来保证更新操作的原子性;(2):将内存分配按照线程划分到不同的空间,即每个线程提前在Java堆中分配一小块内存,称为本地线程分配缓冲区(TLAB)。内存分配完成后,需要将分配的内存空间初始化为零值,以保证对象的实例字段可以直接在Java代码中使用,不需要初始值,程序可以访问这些字段的数据类型对应的零值。设置对象,存储对象是哪个类的实例,如何找到类的元数据信息,对象的hash码,对象的GC生成年龄等。在对象标题中。2.对象的内存布局:内存中存储的对象的布局可以分为三块:对象头、实例数据和填充。对象头,包括两部分信息:
(1):存储对象本身的运行时数据,如哈希代码、GC生成年龄、锁状态标志、线程持有的锁、有偏线程ID、有偏时间戳等。这个数据的长度在32位和64位虚拟机中分别是32位和64位,官方称之为Mark Word(一种不固定的数据结构,根据对象的状态重用自己的存储空间)。
(2):类型指针,即指向一个对象的类元数据的指针,虚拟机通过它来确定这个对象是哪个类实例。
例子:一个对象存储的真正有效的信息,即程序代码中定义的各类字段的内容。不管是从父类继承的,还是子类自己定义的,都需要记录。对齐填充:它不必存在,它充当占位符。由于HotSpot VM要求对象的大小必须是8字节的整数倍,而对象的头部分正好是8字节的整数倍,所以当实例数据没有对齐时,会通过对齐填充来完成。3.对象的访问和定位:Java通过栈上的引用数据(局部变量表中的对象引用)操作堆上的特定对象。Reference仅指定对对象的引用,但没有定义如何定位和访问对象在堆中的位置。快速实现对象访问方法。
(1):句柄访问:Java heap会划分一个内存作为句柄池,reference存储对象的句柄地址,包含对象实例数据和类型数据的地址信息。
优点:引用存储了一个稳定的句柄地址。当对象移动时,它只改变句柄中的实例数据指针,而不改变引用。
(2):直接指针:对象地址直接存储在引用中,访问对象类型数据的地址(存储在方法区)放在Java堆中。
优点:更快,节省一个指针定位的时间成本。热点使用直接指针访问。以上是对JVM创建对象以及访问和定位过程的详细解释。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。