在HotSpot虚拟机中,对象实例化的过程包括两个主要阶段:类加载和实例分配。
类加载阶段
在类加载阶段,虚拟机会根据类的完整限定名来找到对应的二进制数据,并将其加载到运行时数据区的方法区中。这个二进制数据包括对象的字段和方法信息,而不包括对象的实例数据。
实例分配阶段
在实例分配阶段,虚拟机需要为对象分配内存空间。内存的分配方式可以有多种,其中有两种常用的方式:指针碰撞和空闲列表。
- 指针碰撞:在堆内存中,用一个指针作为分界点,分为两个部分,一部分已经被使用,一部分还未被使用。分配内存时,移动指针指向的位置,保证内存分配的连续性。但是这种方式要求堆内存中被使用和未被使用的内存空间是连续的,并且需要考虑线程安全的分配。
- 空闲列表:在堆内存中,空闲的内存被组织成一个列表,记录了已使用和未使用的内存块。分配内存时,从空闲列表中查找足够的空间来满足对象的实例数据大小。这种方式解决了内存的连续性问题,并且可以灵活地分配不连续的内存,但也需要考虑线程安全的分配。
除了这两种常用的方式,HotSpot虚拟机还会根据具体情况进行优化和改进。由于对象的实例数据大小不同,虚拟机会根据对象的大小选择合适的内存分配策略,例如利用TLAB(Thread Local Allocation Buffer)进行线程本地分配,提高分配效率。
总体而言,HotSpot虚拟机中的对象实例化的过程就是通过类加载阶段加载类的信息,然后在实例分配阶段为对象分配内存空间。内存的分配方式常用的有指针碰撞和空闲列表,具体的方式会根据对象的大小和虚拟机的优化策略而定。