TLAB 内存分配

一、简介

TLAB,全称 Thread Local Allocation Buffer,即线程本地分配缓存。是一块 线程专用 的内存分配区域。TLAB 占用的是 eden 区的空间,在 TLAB 启用的情况下(默认开启),JVM 会为每一个线程分配一块私有缓存区域区域,即为 TLAB 内存区域。

尽管不是所有的对象实例都能够在TLAB中成功分配内存,但JVM确实是将TLAB作为内存分配的首选。

二、意义

  • 加速对象的分配。由于对象一般分配在堆上,而堆是线程共用的,因此可能会有多个线程在堆上申请空间,而每一次的对象分配都必须线程同步,会使分配的效率下降。
  • 多线程同时分配内存时,使用 TLAB 可以 避免一系列的非线程安全问题,同时还能够 提升内存分配的吞吐量,因此我们可以将这种内存分配方式称为 快速分配策略

三、JVM 中 TLAB 相关参数解析

参数 作用 备注
-XX:+UseTLAB 启用 TLAB 默认启用
-XX:TLABRefillWasteFraction 设置允许空间浪费的比例 默认值:64,即使用 1/64 的 TLAB 空间大小作为 refill_waste
-XX:TLABWasteTargetPercent 设置 TLAB 空间所占用 Eden 空间的百分比大小 默认 1,即占用 Eden 空间 1 %
-XX:-ResizeTLAB 禁止系统自动调整 TLAB 大小
-XX:TLABSize 指定 TLAB 大小 单位:B

其中,-XX:TLABRefillWasteFraction 指当 TLAB 空间不足,请求分配的对象内存大小超过此阈值时不会进行 TLAB 分配,直接进行堆内存分配,否则还是会优先进行 TLAB 分配。

四、栈上分配和 TLAB 分配

内存区域

  • 栈上分配使用的是栈来进行对象内存的分配。
  • TLAB 分配使用的是 Eden 区域进行内存分配,实际还是属于堆内存。

优先级

  • 栈上分配优先于 TLAB 分配进行,逃逸分析中若可进行栈上分配优化,会优先进行对象栈上直接分配内存。
  • 当无法进行栈上直接分配时,则会进行 TLAB 分配。
图1. TLAB分配流程

图为对象创建时内存分配的流程。

你可能感兴趣的:(TLAB 内存分配)