对象的创建
虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。
对象的内存布局
在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头、实例数据和对齐填充。
- 对象头:类的元数据的指针、对象的哈希码、对象的GC分代年龄等。
- 实例数据:对象真正存储的有效信息 ,也是在程序代码中所定义的各种类型的字段内容。
- 对齐填充:HotSpot虚拟机规定对象的大小必须是8字节的整数倍。当对象实例数据部分不满足要求时,对齐填充自动补全。
对象的访问定位
建立对象是为了访问对象,我们的Java程序需要通过栈上的reference数据来操作堆上的具体对象。由于reference类型在Java虚拟机规范中只规定了一个指向对象的引用,而没有定义这个引用应该通过何种方式去定位、访问堆中的对象的具体位置,所以对象访问方式也是取决于具体虚拟机的实现。目前主流的访问方式有使用句柄和直接指针两种。HotSpot虚拟机使用直接指针作为对象的访问方式。