什么是指针碰撞?什么是空闲列表?

内存分配可以采用两种方式:指针碰撞(Bump The Pointer)和空闲列表(Free List)。

指针碰撞方式假设Java堆中的内存是绝对规整的,已使用的内存和空闲的内存分别放置在堆的两端,两者之间通过一个指针作为分界点的指示器进行区分。在这种情况下,内存分配仅需要将指针向空闲空间的方向移动一段与对象大小相等的距离,从而完成内存的分配,因此称为"指针碰撞"。

而当Java堆中的内存并非规整的时候,已使用的内存和空闲的内存交错分布。在这种情况下,虚拟机需要维护一个空闲列表,记录哪些内存块是可用的。在分配对象实例时,虚拟机会从空闲列表中找到一块足够大的空间,并进行分配。分配完成后,还需要更新空闲列表的记录。这种方式被称为"空闲列表"。

选择使用哪种方式取决于Java堆是否规整。如果Java堆是规整的,可以使用指针碰撞方式进行内存分配。而如果Java堆不规整,虚拟机需要维护空闲列表,并通过空闲列表方式进行内存分配。Java堆是否规整与所选择的垃圾收集器是否具有压缩整理能力相关。如果垃圾收集器具有压缩整理能力,即能够将存活对象向一端移动并整理内存空间,那么Java堆就是规整的;反之,如果垃圾收集器不具备压缩整理能力,那么Java堆就是不规整的。

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题