【对象实例化】面试常见问题及解析

3.2面试常见问题及解析

3.2.1 请详细叙述对象初始化的过程

问题剖析:当面试官提出这个问题时,主要考察你对对象初始化全过程的理解。回答这个问题切勿背诵,要有条理性地组织语言并讲出自己的理解。比如,对象初始化的目的是什么?什么条件下才能执行对象初始化?对象初始化与内存的哪块进行交互?

回答模板:

  • 先讲讲对象初始化的目的
  • 然后讲讲对象初始化的先决条件
  • 然后讲分配内存那部分
    • 在内存哪个位置分配内存?一定在堆中分配内存么?展开聊聊逃逸分析
    • 有几种分配方式?可以展开聊聊CAS和TLAB
    • 内存分配线程安全么?
  • 然后讲讲初始化
    • 结合对象内存布局聊聊MarkWord,Klass Pointer和实例数据
    • 在MarkWord的技术上聊聊和多线程、锁相关的内容
    • 可以再拓展讲讲一个对象到底占多少内存?基本类型和引用类型的字段到底占多少内存?最好自己有实践并测试过
       

3.2.2 所有对象都在堆内存上分配使用空间么?

问题剖析:当面试官提出这个问题时,主要考察你对对象实例化中内存分配的理解。这部分内容可以从两个角度出发,先谈在堆内存上分配的场景,然后谈特殊情况,即不在堆上分配的情况。

回答模板:

  • 先讲讲对象分为哪几类?数组对象和非数组对象
  • 然后讲在堆中分配内存的情况
    • 在Eden区分配的情况
    • 在TLAB分配的情况?TLAB满了怎么办?
  • 然后讲不在堆分配的情况
    • 啥时候不在堆分配?
    • 扩展讲讲逃逸分析JIT

3.2.3 对象实例化时能保证线程安全么?

问题剖析:当面试官提出这个问题时,主要考察你对对象实例化中内存分配的细节是否掌握。
 

回答模板:不能。先说一下JVM是否天然支持多线程场景分配内存的线程安全问题,然后给出一个实例讲解如何发生线程不安全,最后讲讲解决思路。

相关理论:
代码在线上运行时,必须要保证创建对象的线程安全。考虑如下一种场景,对象A正在分配内存,然而指针还没修改时对象B完成了同一块内存的分配并修改了指针。虚拟机一般采用两种方式来保证这一阶段的线程安全:

  • CAS + 失败重试
  • TLAB

CAS是无锁并发的典型实现。CAS不进行加锁而是假设没有冲突而去完成某项操作。如果因为冲突失败就自旋重试,直到成功为止。虚拟机采用CAS+失败自旋重试的方式保证更新操作的原子性。
 

3.2.4 请谈谈你对对象头的理解,是否知道每个部分所占字节数?

问题剖析:当面试官提出这个问题时,主要考察你对对象头初始化的细节是否掌握。

回答模板:

  • 先讲对象头是什么?可以结合对象内存模型展开分析
    • 对象头有几部分?
    • 数组和非数组在对象头有啥区别?
  • 然后以32位JVM为例分析对象头的组成结构
    • MarkWord都有哪些属性,每个属性占多少个bit?
    • MarkWord在多线程场景下,锁粗化时发生了什么变化?
    • Klass Pointer是什么?
       

3.2.5 一个对象到底占多少空间

言多无用,不如实操一下。这里引用了一个包用于测试不同对象所占的内存空间:

<dependency>
  <groupId>org.openjdk.jol</groupId>
  <artifactId>jol-core</artifactId>
  <version>0.8</version>
</dependency>

下面给出多个例子检验对象实际占用空间大小。

空对象
public static void main(String[] args) {

    System.out.println("sizeOf(new Object()) = " + ClassLayout.parseInstance(new Object()).toPrintable());
}

 

在打开指针压缩时将会输出(-XX:+UseCompressedOops):

sizeOf(new Object()) = java.lang.Object object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4        (object header)                           e5 01 00 20 (11100101 00000001 00000000 00100000) (536871397)
     12     4        (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

打开指针压缩时,对象头部总计16bytes:

  • MarkWord占8byte
  • KlassPointer占4byte
  • 对齐填充部分占4byte

在关闭指针压缩时将会输出(-XX:-UseCompressedOops):

sizeOf(new Object()) = java.lang.Object object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4        (object header)                           00 1c 4b 17 (00000000 00011100 01001011 00010111) (390798336)
     12     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

在关闭指针压缩时,对象头部总计16bytes:

  • MarkWord占8byte
  • KlassPointer占8byte
  • 无对齐填充部分
数组对象

默认打开指针压缩。

先来看看int[]的实际情况

public static void main(String[] args) {

    int[] data = new int[5];
    System.out.println("sizeOf(int[]) = " + ClassLayout.parseInstance(data).toPrintable());
}
sizeOf(int[]) = [I object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     4        (object header)                           01 00 00 00 (0000

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Java面试必问JVM考点精讲 文章被收录于专栏

“挨踢”行业行情日益严峻,企业招聘的门槛也随之越来越高,大厂hc少之又少。 庞大的知识体系下,不知道学什么、怎么学? 面试高频考点是什么、怎么回答才能得到面试官的青睐? 作为后端求职者,在Java的道路上越走越宽。 本专刊则针对Java面试考点上,精讲JVM知识点,为大家的大厂求职路保驾护航! 针对如今校招痛点,深入详解JVM知识考点,列出高频真题并详细解答!探索JVM精髓!

全部评论

相关推荐

11-13 20:16
已编辑
厦门理工学院 软件测试
专业嗎喽:硕佬,把学校背景放后面几段,学校背景双非还学院,让人看了就不想往下看。 把实习经历和个人奖项放前面,用数字化简述自己实习的成果和掌握的技能,比如负责项目一次通过率90%,曾4次发现项目潜在问题风险为公司减少损失等等
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务