什么是 Java 的 PLAB?
什么是 Java 的 PLAB?
回答重点
PLAB(Promotion Local Allocation Buffer) 是 Java 垃圾回收器中的一种优化机制,主要用于 G1 垃圾收集器,目的是提高对象晋升(Promotion)到老年代时的效率。
在垃圾回收过程中,新生代中的某些对象由于生命周期较长,会被晋升到老年代。为了减少线程竞争和提升晋升效率,G1 为每个 GC 线程分配一个局部缓冲区,称为 PLAB。每个线程可以在其本地 PLAB 中直接进行对象晋升操作,而不需要竞争全局老年代的内存空间,减少了锁竞争,提高了多线程垃圾回收的效率。
扩展知识
进一步理解
在多线程并行执行 YGC 时,可能有很多对象需要晋升到老年代,此时老年代的指针就“热”起来了,于是搞了个 PLAB。
每个线程先从老年代 freelist(空闲内存链表) 申请一块空间(PLAB),然后单个线程在这一块空间中就可以通过指针加法(bump the pointer)来分配内存,这样对 freelist 竞争也少了,分配空间也快了。
大致就是上图这么个思想,每个线程先申请一块作为 PLAB ,然后在这一块内存里面分配晋升的对象。
这和 TLAB 的思想相似。
PLAB 参数调优
- **
G1PLABWastePercent**:这个参数定义了 PLAB 空间中可容忍的浪费百分比。默认值为 10%,如果浪费的空间超过该值,PLAB 的大小会调整。 - **
PLABSize**:PLAB 的大小在每次垃圾回收周期中是动态调整的,依赖于对象晋升的情况和空间使用率。如果发现晋升对象超出 PLAB 容量,JVM 会自动扩大 PLAB 缓冲区。
TLAB
Comments