JVM对内存的分配有两种方式:
- 指针碰撞
当Java堆中的内存是绝对规整的时候,即已使用内存和空闲内存被指针分开,分配内存只需要将这个指针向空闲方向挪与对象大小相等的距离。
这种方式操作简单、但是要求内存空间规整。
- 空闲列表
当Java堆中的内存不是绝对规整的时候,即已使用内存和空闲内存交错混杂,此时无法使用指针碰撞,虚拟机必须维护一个列表,记录哪些内存是可用的,在分配的时候从列表中找到足够大的空间分配给实例对象。
这种方式需要一个列表,而且存在空间碎片问题。
具体使用哪种方式分配是由回收机制决定的。