内存分配的方式有“指针碰撞”(Bump the Pointer)和空闲列表法。
- 指针碰撞法:默认使用指针碰撞法,在这种内存分配策略中,Java堆内存被视为一个绝对规整的连续空间,其中维护一个称为“分配指针”的指示器。分配指针的一边是已经被分配的内存,另一边是尚未使用的内存。当一个新的对象需要分配内存时,JVM仅仅将这个分配指针向未使用内存的方向移动一个与新对象大小相等的距离。
- 空闲列表法:在空闲列表法中,JVM维护一个列表来跟踪堆中的空闲内存块。这些内存块是由于对象被垃圾收集器回收而产生的,因此它们的大小和位置可以不连续。
- 当有新对象需要内存分配时,JVM遍历空闲列表,寻找第一个满足所需大小的空闲块。这个搜索过程可以基于不同的策略,如首次适应(first-fit)、最佳适应(best-fit)、最差适应(worst-fit)等。
对比
- 效率问题:与指针碰撞法相比,空闲列表法在内存分配时可能会更耗时,因为需要遍历和搜索列表来找到合适的空闲块。
- 碎片化管理:空闲列表法可以更有效地应对内存碎片化问题,通过利用不连续的空闲内存块,减少了因碎片化导致的内存浪费。