一,对象实例化
创建对象的六种方式
对象实例化的六个步骤
创建对象的基本代码
public class ObjectTest {
public static void main(String[] args) {
Object obj = new Object();
}
}
使用idea的jclasslib插件查看main方法的字节码(code)
0 new #2 <java/lang/Object>
3 dup
4 invokespecial #1 <java/lang/Object.<init>>
7 astore_1
8 return
二,对象内存布局
对象头
实例数据
填充数据
示例代码
public class Customer{
int id = 1001;
String name;
Account acct;
{
name = "匿名客户";
}
public Customer(){
acct = new Account();
}
}
class Account{
}
三,对象访问定位
JVM是如何通过栈帧中的对象引用访问到其内部的对象实例的呢
先通过栈上引用reference找到堆,然后找到方法区
具体的实现有2种,JVM没有规定,不同虚拟机有自己的实现
1,句柄访问 2,直接指针
具体到我们平时使用的jdk8使用的是直接指针
1,句柄访问
优点:feference中存储稳定句柄地址,对象被移动(垃圾收集时移动对象很普通)时,只会改变句柄中实例数据指针,feference本身不需要修改
2,直接指针(HotSpot采用)
面试题
- 美团
- 对象在JVM中是怎么存储的?
- 对象头信息里面有哪些东西?
- 蚂蚁金服:
- 二面:java对象头里有什么?