一,对象实例化
创建对象的六种方式
对象实例化的六个步骤
创建对象的基本代码
public class ObjectTest {public static void main(String[] args) {Object obj = new Object();}}
使用idea的jclasslib插件查看main方法的字节码(code)
0 new #2 <java/lang/Object>3 dup4 invokespecial #1 <java/lang/Object.<init>>7 astore_18 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对象头里有什么?



