什么是 Java 的 PLAB(Promotion Local Allocation Buffer)?

PLAB 全称是 Promotion Local Allocation Buffer,是 Java 垃圾回收机制中的一个重要概念,主要用于优化 对象晋升(Promotion)的性能。PLAB 是在垃圾回收器处理内存分配时,为每个线程分配的一块缓冲区域,专门用于临时存放从新生代晋升到老年代的对象。


1. PLAB 的背景

  • 在垃圾回收(GC)过程中,当 新生代 的对象不能存活在新生代(如 EdenSurvivor 区无法容纳)时,需要将这些对象晋升到 老年代
  • 如果每个线程直接操作老年代内存,可能会导致大量的同步锁争用,降低性能。
  • 为了解决这一问题,JVM 引入了 PLAB,让线程可以在局部缓冲区中分配晋升对象,减少对老年代内存的直接访问。

2. PLAB 的作用

  • 减少线程间的竞争:通过为每个线程分配独立的缓冲区,避免多个线程直接操作老年代的共享内存,减少锁竞争。
  • 提高晋升效率:在垃圾回收过程中,线程可以高效地将需要晋升的对象暂时存放到 PLAB,然后再批量写入老年代。
  • 优化内存使用:PLAB 缓冲区分配在新生代垃圾回收期间,会动态调整其大小,以尽量减少内存碎片和浪费。

3. PLAB 的工作机制

  • 分配缓冲区:当触发垃圾回收(如 Minor GC)时,JVM 为每个线程分配一个 PLAB
  • 对象晋升:线程将需要晋升到老年代的对象写入自己的 PLAB
  • 合并到老年代:当垃圾回收结束后,PLAB 中的对象被批量写入到老年代,释放缓冲区。

4. PLAB 的调整

PLAB 的大小可以通过 JVM 参数调整:

  • -XX:PLABSize

    • 用于设置 PLAB 的初始大小。
    • 默认值根据 JVM 的内存模型动态调整。
  • -XX:UsePLAB

    • 是否启用 PLAB(默认启用)。

JVM 会根据应用程序的运行情况动态调整 PLAB 的大小,以达到最佳性能。


5. PLAB 的优缺点

优点:

  • 提高垃圾回收性能:通过减少线程竞争和直接写入老年代的次数,降低了 GC 的停顿时间。
  • 避免碎片化:批量分配对象到老年代,减少内存碎片的产生。

缺点:

  • 需要额外的内存管理:PLAB 本身会占用一部分内存,并增加 JVM 的内存管理复杂度。
  • 内存浪费风险:如果 PLAB 过大而未被充分利用,会造成内存浪费。

6. 总结

PLAB 是 JVM 的垃圾回收机制中用于优化对象晋升性能的重要工具。通过为每个线程分配一个本地缓冲区,PLAB 减少了线程之间的竞争,并提高了从新生代晋升到老年代的效率。

优化点:

  • 减少线程锁争用。
  • 提高晋升对象的分配效率。
  • 降低垃圾回收停顿时间。

在高并发应用中,PLAB 的使用对垃圾回收性能的提升尤为明显。

什么是 Java 的 PLAB(Promotion Local Allocation Buffer)?的更多相关文章

  1. 线程TLAB局部缓存区域(Thread Local Allocation Buffer)

    TLAB(Thread Local Allocation Buffer) 1,堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也导致了new对象的开销是比较大的 2,Sun ...

  2. 堆中的线程私有缓存区域TLAB(Thread Local Allocation Buffer)

    TLAB产生的原因 堆区是线程共享区域,任何线程都可以访问到堆区中的共享数据 由于对象实例的创建在JVM中非常频繁,因此在并发环境下从堆区中划分内存空间是线程不安全的 为避免多个线程操作同一地址,需要 ...

  3. java UTC时间和local时间相互转换

    java UTC时间和local时间相互转换 1.local时间转UTC时间 /** * local时间转换成UTC时间 * @param localTime * @return */ public ...

  4. HBase 中 Memstore-Local Allocation Buffer

    在0.90 版本后的 HBase,引入了一个高级机制用于缓解堆内存碎片的问题.此内存碎片问题的产生的主要原因是由于 memstore 上的扰动(频繁的分配与释放内存空间)导致.对应解决此问题的机制为M ...

  5. Spring整合JUnit4进行AOP单元测试的时候,报:"C:\Program Files\Java\jdk1.8.0_191\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2018.3\lib\idea_rt.jar=64

    错误代码 "C:\Program Files\Java\jdk1.8.0_191\bin\java.exe" -ea -Didea.test.cyclic.buffer.size= ...

  6. java.io.FileNotFoundException: /usr/local/hadoop/logs/fairscheduler-statedump.log(权限不够)解决方案

    问题描述:Linux虚拟机内使用hadoop 解决方案: $ su 密码:****** # chown hadoop 文件名 进入超级管理员,为hadoop用户分配该文件的权限. 完美解决:

  7. java的nio之:java的nio系列教程之buffer的概念

    一:java的nio的buffer==>Java NIO中的Buffer用于和NIO通道Channel进行交互.==>数据是从通道channel读入缓冲区buffer,从缓冲区buffer ...

  8. Java NIO学习系列一:Buffer

    前面三篇文章中分别总结了标准Java IO系统中的File.RandomAccessFile.I/O流系统,对于I/O系统从其继承体系入手,力求对类数量繁多的的I/O系统有一个清晰的认识,然后结合一些 ...

  9. JAVA NIO系列(三) Buffer 解读

    缓冲区分类 NIO中的buffer用于和通道交互,数据是从通道读入缓冲区,从缓冲区中写入通道的.Buffer就像一个数组,可以保存多个类型相同的数据.每种基本数据类型都有对应的Buffer类: 缓冲区 ...

  10. java中的垃圾回收算法与垃圾回收器

    常用的垃圾回收算法 标记-清除 标记清除算法是一种非移动式的回收算法,分为标记 清除 2个阶段,简而言之就是先标记出需要回收的对象,标记完成后再回收掉所有标记的内存对象,如下图 可见回收后图中被标记的 ...

随机推荐

  1. java中的ArrayBlockingQueue

    ArrayBlockingQueue ArrayBlockingQueue 是 Java 并发包 (java.util.concurrent) 中的一个线程安全的阻塞队列实现. 它基于数组实现,容量固 ...

  2. SOUI4新版本的日志系统介绍

    原来的日志输出宏用法有点奇怪,感觉总是不够理想.这近有点时间终于把它重整了一下. 以前的用法就不介绍了,重点介绍一下新版本的用法. 在SOUI中使用的日志系统包含两个部分:日志输出宏及日志到文件的打印 ...

  3. HPC的基本概念

    本文分享自天翼云开发者社区<HPC的基本概念>,作者:它零食抱佛jio HPC(High Performance Computing)是一种高性能计算技术,它利用大规模并行处理器集群或超级 ...

  4. 闲话 6.30 -JL 引理

    参考了 https://spaces.ac.cn/archives/8679/comment-page-1,有一些增删. JL 引理 首先下面需要应用马尔可夫不等式的另一个形式: \[\newcomm ...

  5. Linux mint安装外部软件

    //更新系统  sudo apt-get update更新ruanjian sudo apt-get upgrade更新系统 //安装浏览器 sudo apt-get install chromium ...

  6. kvm virtio window server2003

    https://www.linux-kvm.org/page/Downloads 这是kvm官网对virtio讲解 http://www.linux-kvm.org/images/d/dd/KvmFo ...

  7. pycharm上传github问题:rejected

    我从pycharm上传项目时,遇到的问题: 以下是一些解决思路: 这个错误提示表明,你在尝试将本地代码推送到远程仓库时,远程仓库中已经包含了你本地尚未获取的更改.换句话说,远程仓库的代码比你的本地代码 ...

  8. Django setting可以配置什么?

    Setting配置信息 注册子应用 # 注意:需要修改Django的全局配置文`settings.py`'''1. 创建子应用 1)在pycharm中创建 python manage.py start ...

  9. Typecho输出html颜色字教程

    !!! 这里是红色 !!! !!! 这里是绿色 !!! typecho输出html教程 只需要用!!!包裹html即可实现! 用法 !!! <font color="red" ...

  10. Azure Data Factory - [01] 触发器

    题记部分 一.概述   Azure Data Factory(后面简称ADF)的触发器是一种机制,用于在特定事件发生时自动执行数据管道.触发器可以基于事件间隔.数据变化或其他外部事件来启动数据管道的执 ...