资讯详情

阿里java面试题下载,真香

一、对象实例化

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)]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

标签: 72v180ah锂电池电容量

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台