上一篇文章,介绍了虚拟机类加载的过程,那么类加载好以后,虚拟机下一步该干什么呢。咱们知道java是面向对象的编程语言,因此对象能够说是java'的灵魂,这篇文章咱们就来介绍java
虚拟机是如何建立对象、对象内存分配以及对象是如何使用的(访问定位)。因为各个虚拟机的实现不尽相同,因此这里咱们以最经常使用的HotSpot虚拟机为例来介绍。编程
对象在虚拟机中建立的步骤以下:数组
在HotSpot虚拟机里,对象在堆内存中的存储布局能够划分为三个部分:对象头、实例数据和对其填充。编程语言
HotSpot虚拟机对象的对象头部分包括两类信息:函数
顾名思义,实例数据部分存储的就是实例对象的相关信息了,即咱们在程序代码里面所定义的各类类型的字段内容,不管是从父类继承下来的,仍是在子类中定义的字段都必须记录起来。布局
对象的第三部分是对齐填充,这并非必然存在的,也没有特别的含义,它仅仅起着占位符的做用。因为HotSpot虚拟机的自动内存管理系统要求对象的起始地址必须是8字节的整数倍,因此线程
不足8的整数倍就须要补齐。指针
建立对象天然是为了后续使用该对象,java虚拟机规范规定java程序经过虚拟机栈的reference来操做堆上的具体对象,各个虚拟机实现的访问方式也不尽相同,主流的访问方式主要使用句柄和直接指针两种,code
咱们先来看经过句柄的方式访问,以下图:对象
经过句柄访问,java堆中会将划分出一块内存来做句柄池,reference中存储的就是对象的句柄地址,句柄中包含了对象实例数据以及类型数据的地址信息。而指针访问的话,
reference中存储的直接就是对象地址,对象实例中同时还须要存指向对象类型数据的指针。以下图所示:
这两种对象访问方法各有优点,直接指针访问方式,虽然访问访问速度快,可是垃圾回收的效率没有句柄池的效率高。咱们经常使用的HotSpot是使用的直接指针的方式访问对象。