假设JVM堆中内存是规整的所有用過的内存放在一边,没用过的内存放在另一边中间放着一个指针作为分界点的指示器,那所分配内存的过程就仅仅是把那个指针向空闲涳间的方向挪动一段与对象大小相等的距离这种分配方式被称为“指针碰撞(Bump the Pointer)”。
如果JVM堆中的内存不是规整的使用过的内存空间与未使用的内存空间相互交错,那就没办法进行简单的“指针碰撞”了虚拟机就必须维护一个列表,记录哪些内存块是可用的分配的时候在列表中找到一段足够大的内存空间分配给对象实例,并更新列表中的记录这种分配方式被称为“空闲列表(Free
可见,选择哪种内存分配方式由JVM堆内存是否规整决定而JVM堆内存是否规整又由所采用的垃圾收集器是否有整理过程所决定,因此使用Serial、ParNew等代用Compact过程的垃圾收集器时,采用“指针碰撞” 方式进行对象实例内存分配而使用像CMS这种基于MARK_SWEEP垃圾回收算法的垃圾收集器时,JVM则采用“空闲列表”为对象实例進行内存分配