#分享几个JVM的面试题
思考:关于Object o = new Object();
1.请解释一下对象的创建过程(半初始化)
2.加问DCL和volitile问题?(指令重排)
3.对象在内存中的存储布局(对象与数组的存储不同)
4.对象头具体包括什么(markword classpointer)
synchronized锁信息
5.对象怎么定位?(直接,间接)
6.对象怎么分配?(栈上–线程本地-Eden-old)
7.Object o = new Object()在内存中占多少字节
8.Class对象是在堆还是在方法区
1.请解释一下对象的创建过程(半初始化)
Class T{
int num = 8;
}
T t = new T();
将以上代码编译后实际的执行步骤为
new T() 实际上是在堆的内存上开辟一片空间用来存储变量num,并且初始化默认值0(半初始化);当调用构造方法的时候(new对象之后吗,默认调用对象的无参构造),将变量num赋值为8;之后调用汇编码astore_1时,将t的指针指向刚才new出来的对象,t存放在栈帧里,里面存放的是指向堆中对象的地址
2.加问DCL和volitile问题?(指令重排)
volatile作用:
a.保持内存可见性
b.禁止指令重排序
DCL:Double Check Lock (双重检查)
/**
* 饱汉式---单例模式
*/
public class Student {
private static volatile Student INSTANCE;
private Student(){
}
public Student getInstance(){
if (INSTANCE==null){
//Double Check Lock
//双重检查
synchronized (Student.class){
if (INSTANCE==null){
INSTANCE = new Student();
}
}
}
return INSTANCE;
}
}
DCL单例必须使用volatile
以上面的单例模式为例分析 多线程场景
当第一个线程使用该对象时,对象的实例为