目录

  • 1. 请解释一下对象的创建过程?
  • 2.加问DCL要不要加volatile问题?
  • 3. 对象在内存中的存储布局?
  • 4. 对象头具体包括什么?
  • 5.对象怎么定位?
  • 6.对象怎么分配?
  • 多少次经过安全区后进入老年代。
  • 7.Object o = new Object() 在内存中占用多少字节?
  • 8. 为什么hotspot不使用c++对象来代表java对象?
  • 9.Class对象是在堆还是方法区。


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

这道题主要考验面试者对于对象的半初始化状态的理解。
一个对象的创建主要经历了三个过程


申请空间

构造器


对象T

内存空间半初始化,赋值初始值

将对象原本的值赋给内存空间


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

2.加问DCL要不要加volatile问题?

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

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

对象在内存中主要有四种类型,markword,classpoint ,instance data, padding

4. 对象头具体包括什么?

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

5.对象怎么定位?

JAVA美团的笔试题 美团java面试题_初始化


句柄(间接方式),直接

6.对象怎么分配?

JAVA美团的笔试题 美团java面试题_java_02


第一步:尝试栈上分配,分配成功,对象随栈信息一起pop

第二步:栈上分配失败,看对象占用内存是否大?如果内存过大,直接进入老年代,通过FGC清理。

第三步:内存不大,进入线程本地缓冲区(TLAB),然后进入Eldn(新生代).

第四步:判断GC ,不需要清除进入S1或S2 安全区。经过多次安全区后,进入老年代。需要清除的直接清理。

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

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

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

答:压缩不压缩都是16个字节

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

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

9.Class对象是在堆还是方法区。

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