目录
- 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.对象怎么定位?
句柄(间接方式),直接
6.对象怎么分配?
第一步:尝试栈上分配,分配成功,对象随栈信息一起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对象在堆。