Java虚拟机学习--对象实例的创建
Posted _zjyc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java虚拟机学习--对象实例的创建相关的知识,希望对你有一定的参考价值。
1.实例化过程: 在语言层面克隆对象,创建对象,反序列化生成对象都是通过new关键字,虚拟机遇到一条new指令后先检查所实例化的类是否加载(加载后则类存在),是否解析,是否初始化,然后再为新生对象分配内存空间(存放在堆中),设置对象实例的对象头,,将对象体置零,然后执行<init>方法
2.内存分配:GC收集器的算法--->>(是否带有压缩整理功能)GC收集器的种类--->>java堆内存是否规整(规整是指内存是否是由完整的一整块的小块内存组成,比如已经使用过的内存都在一个地方,未使用的都在另一个地方)--->>java内存分配方式
2.1 内存分配方式1(空闲列表分配):这种分配方式是因为java堆内存不规整,已使用的和未使用的内存交错,这样的话虚拟机需要维护一个列表,列表中记录内存中哪些内存已使用,哪些内存未使用,在分配空间时,不仅要分配空间,而且要记录在列表中
2.2 内存分配方式2(指针碰撞分配):这种分配方式就是内存规整的情况,使用过的内存在一边,未使用的在另一边,中间用指针作为分界指示器,假如要分配内存,则指针往空闲内存方向挪动出一个对象实例大小的内存空间来存放实例。
2.3分配完内存后对象的空间是存在了,但还没有内容(如专属于本对象的内容),因此要执行init方法将对象实例中的属性字段赋值。
PASS:这里的赋值是通过什么方法呢?是否是通过set方式呢?
3.实例对象分为3个部分对象头,对象体,对齐填充(不一定存在)
3.1对象头主要记录对象的hashcode,GC标记,元数据地址,以及关于对象锁的使用,年龄代,偏向线程等。
3.2对象体记录了我们程序员正常记录到的数据,通常来说,我们只用到这部分数据,即对象中的字段及其值,继承来的字段,如果字段是基本类型,则记录字段名和该字段所指向的基本类型值的地址,如果是引用类型,则指向引用值的地址。
3.2.1事实上这些值都是在虚拟机栈中的局部变量表中,局部变量表中存放了基本类型数据,引用类型(对象)的起始地址,因此对象体中的字段的值就是指向局部变量表中的地址。
3.3对齐填充是否存在是得看对象体是否是8的位数,jvm要求对象实例的大小必须是8的位数(内存单位必须是byte),而对象头的大小固定是byte,所以当对象体中的数据不能够填满整个byte大小的内存,就需要对齐填充来补充。
3.4对象体中的字段存储顺序取决于它在类中定义的顺序和虚拟机分配策略,是分配策略是基本类型在前,oop类型在后(double/long>float>int>short/char>byte/boolean>oop(ordinary object pointer)),在类型相同的情况下,父类字段在前,子类字段在后。
以上是关于Java虚拟机学习--对象实例的创建的主要内容,如果未能解决你的问题,请参考以下文章