一、对象实例化
1.创建对象的方式
-
new:最常见的方法(本质是构造器)
变形1 : Xxx的静态方法
变形2 : XxBuilder/XxoxFactory的静态方法
-
Class的newInstance():反射方式只能调用空参结构器,权限必须是public
-
Constructor的newInstance(Xxx):位于反射模式java.lang.reflect.Constructor 可调用空参、带参的结构器,无权限要求
-
使用clone() :目前需要实现不调用任何结构器的类别Cloneable接口,实现clone()
-
使用反序列化:从文件和网络中获取对象的二进制流
-
第三方库Objenesis
2.创建对象的步骤
1.判断对象对应的类别是否加载、链接和初始化
遇到一个虚拟机会new指令,首先检查指令的参数是否在Metaspace的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化。( 即判断类元信息是否存在)。
如果没有,在父母的指定模式下,使用当前的加载器ClassLoader 包名 类名为Key找对应的.class文件。如果找不到文件,就扔掉ClassNotFoundException异常情况下,如果发现,将进行类加载并生成相应的Class类对象
2.为对象分配内存
首先计算对象占用空间的大小,然后将一块内存划分到堆中。 若实例成员变量为引用变量,则只能分配引用变量空间,即四个字节大小。
- 若内存规则,请使用 如果内存规则,虚拟机将采用指针碰撞法(BumpThePointer)为对象分配内存。这意味着所有使用过的内存都在一边,而空闲内存在另一边。中间有一个指针作为边界点的指示器。分配内存只是将指针移动到空闲的一侧,与物体大小相等。如果选择垃圾收集器,Serial、ParNew虚拟机采用这种基于压缩算法的分配方法。所以一般用带compact(整理)收集器时,用指针碰撞。
- 如果内存不规则,虚拟机需要维护列表并使用它 如果内存不是规整的,已使用的内存和未使用的内存相互交错,那么虚拟机将采用的是空闲列表法来为对象分配内存。意思是,记录哪些内存块是可用的。重新分配时,从列表中找到足够大的空间分配给对象实例,并更新列表上的内容。这种分配方法已成为空闲列表(Free List) ”。
3.处理和发布安全问题
在分配内存空间时,另一个问题是及时保证new线程安全:创建对象操作非常频繁,虚拟机需要解决并发问题。虚拟机使用 解决并发问题的方法有两种:
- CAS ( Compare And Swap )失败重试和区域锁定:确保指针更新操作的原子性;
- TLAB把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存,称为本地线程分配缓冲区,(TLAB ,Thread Local Allocation Buffer) 是否使用虚拟机TLAB,可以通过一XX: /一UseTLAB参数来 设定。
4.初始分配到的空间
Java赋值对象属性有四种操作:
- 默认初始化属性
- 显式初始化
- 代码块初始化
- 初始化的结构
在内存分配结束时,虚拟机将分配的内存空间初始化为零(不包括对象头)。这一步确保了对象的实例字段Java代码可以直接使用,无需赋予初始值,程序可以访问这些字段的数据类型对应的零值。
5.设置对象的对象头
对象所属类别(即类元数据信息)和对象HashCode和对象的GC存储在对象头中的信息、锁定信息和其他数据。该过程的具体设置取决于JVM实现。
6.执行init初始化方法
在Java从程序的角度来看,初始化才正式开始。初始化成员变量,实施实例代码块,调用类结构方法,并将堆内对象的第一个地址赋值引用变量。 所以一般来说(是否跟随字节码?invokespecial指令决定),new指令之 然后是执行方法,根据程序员的意愿初始化对象,从而完全创建真正可用的对象。
二、对象内存布局
1.对象头(Header)
包含两部分
-
- 哈希值( HashCode )
- GC分代年龄
- 锁状态标志
- 持有线程的锁
- 偏向线程ID
- 偏向时间戳
- :指向类元数据InstanceKlass,确定对象的类型
2.实例数据(Instance Data)
说明:它是对象真实存储的有效信息,包括程序代码中定义的各种类型的字段(包括从父亲那里继承和拥有的字段) 规则:
- 相同宽度的字段总是分配在一起
- 父类中定义的变量会出现在子类之前
- 如果CompactFields参数为true(默认为true),子类的窄变量可能插入父类变量的间隙
3.对齐填充(Padding)
不必要,也没有特别的意义,只起到占位符的作用
最后
鉴于最近很多人都在面试,我也整理了相当多的面试专题资料,还有其他大厂的面经。希望对大家有所帮助。
最新整理面试题
以上面试题的答案都整理成文档笔记。 还整理了一些面试资料&2021年收集的一些大厂面试真题,
最新整理电子书
最新整理大厂面试文档
最新整理电子书
[外链图片转存中…(img-aE3V180R-1625505439649)]
最新整理大厂面试文档
[外链图片转存中…(img-W1cKjSM2-1625505439651)]
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。