一线互联网大厂JVM面试题

1、class的生命周期?

A、Loading【加载】

B、Linking【连接】:其中连接又包含了验证,准备,解析三个阶段

验证(Verification):校验装载的class文件是否符合JVM规范

准备(Preparation):将class文件的静态变量赋默认值

解析(Resolution):将类、方法、属性等符号引用解析为直接引用。对class文件常量池中各种符号引用进行解析,转成指针,偏移量等内存地址的直接引用

C、Initialization【初始化】:调用类初始化代码,给静态成员变量赋初始值

D、Using【使用】

E、Unloading【卸载】

2、请解释一下对象的创建过程?

A、class loading【加载】

B、class linking【连接:verification,preparation,Resolution】

C、class initializing【初始化】

D、申请对象内存

E、成员变量赋默认值

F、调用构造方法<init> -->成员变量顺序赋初始值,执行构造方法语句

3、对象在内存中的存储布局?

普通对象:

对象头:markword 8个字节

ClassPointer:用来说明对象属于哪个class,为4个字节

实例数据:成员变量,即对象中各个实例字段的数据

padding的对齐:8的倍数,因为是按块来读

数组对象:

对象头:markword 8个字节共计64位

ClassPointer:用来说明对象属于哪个class,为4个字节

数组长度:4字节

数组数据:

padding的对齐:8的倍数,因为是按块来读

4、对象头具体包含什么?

对象头用于存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁等

 

 

5、GC年龄最大为15?

因为对象头*采用4个bit位来保存年龄,4个bit位能表示的最大数就是15

6、对象怎么定位?

T t = new T(); 指 t 是如何找到 T 的

句柄池:t 指向两个指针,一个指向T.class,一个指向真正的对象

直接指针:t 直接指向真正的对象,然后再继续指向T.class

7、对象怎么分配?

首先尝试在栈上进行对象分配【垃圾回收时不需要垃圾回收器回收,直接弹出即可】

如果对象太大则放入老年代,等FGC进行回收

当多个线程同时New 对象时则存储在Eden区,然后会执行GC,GC年龄到了则进入老年代,年龄不到则会重复GC的过程。

8、Object o = new Object在内存中占用多少字节?

对象头:8字节

classpointer :4字节【由于java默认使用了calssPointer压缩】

padding: 4字节

共计:8+4+4=16字节 如果没开启classpointer默认压缩,markword 8字节,classpointer 8字节,padding 0字节 也是16字节

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值