美团java面试灵魂9连问

本文详细介绍了Java对象从内存申请、构造器初始化、内存布局到定位、分配的过程,涉及volatile、指令重排、对象头、安全区和类对象的区别,以及为何HotSpot不使用C++对象表示Java对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

        半初始化   对于对象的半初始化状态的理解

 一个对象的创建主要经历了三个过程

第一步:对象申请内存空间,将对象实例属性初始化成初始值。
第二步:通过该对象的构造器,将对象原本初始值赋值给内存空间
第三部:将对象与内存空间建立连接

加问DCL要不要加volatile问题?

        指令重排,第一题中我们得知对象的创建过程,这个过程可能会造成指令重排问题,所以要想完全避免,需要根据你的业务场景判断是否增加 volatile 关键字

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

        对象和数组的存储不同,对象在内存中主要有四种类型,markword,classpoint ,instance data, padding

对象头具体包括什么?

        markword  classpointer  锁信息

        markword 主要包括 hashcode,锁信息,GC信息

对象怎么定位?

        直接,句柄(间接)

对象怎么分配?

        栈上  线程本地  eden  old

第一步:尝试栈上分配,分配成功,对象随栈信息一起pop
第二步:栈上分配失败,看对象占用内存是否大?如果内存过大,直接进入老年代,通过FGC清理。
第三步:内存不大,进入线程本地缓冲区(TLAB),然后进入Eldn(新生代).
第四步:判断GC ,不需要清除进入S1或S2 安全区。经过多次安全区后,进入老年代。需要清除的直接清理。

多少次经过安全区后进入老年代?

可通过jvm参数进行配置。默认 使用 PN+PO是 15次,使用CMS是6次

Object o = new Object() 在内存中占用多少字节?

压缩, 是16个字节

为什么hotspot不使用c++对象来代表java对象?

因为C++对象有一个virtual table 这个是java对象所不需要也没有的。会占用内存。

Class对象是在堆还是方法区?

C++对象在方法区,Java对象在堆。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值