本地线程分配缓存(TLAB)

2020/05/31 Jvm

TLAB概念,源码阅读

目录

待补充

什么是TLAB?

本地线程分配缓存,jdk1.8默认开启,所以我们项目jvm参数不用特意配置。

java对象分配一般在堆上(不一定在堆上分配,逃逸分析),堆是所有线程共享的,

那么就存在多线程问题,在没有引入TLAB时采用加锁同步机制,对象创建频繁,导致性能低下。

引入TLAB后,

https://dzone.com/articles/thread-local-allocation-buffers

https://alidg.me/blog/2019/6/21/tlab-jvm

TLAB全称ThreadLocalAllocBuffer,是线程的一块私有内存,如果设置了虚拟机参数 -XX:UseTLAB,在线程初始化时,同时也会申请一块指定大小的内存,只给当前线程使用,这样每个线程都单独拥有一个Buffer,如果需要分配内存,就在自己的Buffer上分配,这样就不存在竞争的情况,可以大大提升分配效率,当Buffer容量不够的时候,再重新从Eden区域申请一块继续使用,这个申请动作还是需要原子操作的。

TLAB的目的是在为新对象分配内存空间时,让每个Java应用线程能在使用自己专属的分配指针来分配空间,均摊对GC堆(eden区)里共享的分配指针做更新而带来的同步开销。

TLAB只是让每个线程有私有的分配指针,但底下存对象的内存空间还是给所有线程访问的,只是其它线程无法在这个区域分配而已。当一个TLAB用满(分配指针top撞上分配极限end了),就新申请一个TLAB,而在老TLAB里的对象还留在原地什么都不用管——它们无法感知自己是否是曾经从TLAB分配出来的,而只关心自己是在eden里分配的。

作者:占小狼
链接:https://www.jianshu.com/p/cd85098cca39

源码分析

1.类的描述

// ThreadLocalAllocBuffer: a descriptor for thread-local storage used by
// the threads for allocation.
//            It is thread-private at any time, but maybe multiplexed over
//            time across multiple threads. The park()/unpark() pair is
//            used to make it available for such multiplexing.
class ThreadLocalAllocBuffer: public CHeapObj<mtThread> {
  friend class VMStructs;

ThreadLocalAllocBuffer:用于分配线程本地存储,在任何时候都是线程私有的,

2.类的主要成员属性

private:
  HeapWord* _start;                              // address of TLAB
  HeapWord* _top;                                // address after last allocation
  HeapWord* _pf_top;                             // allocation prefetch watermark
  HeapWord* _end;                                // allocation end (excluding alignment_reserve)
  size_t    _desired_size;                       // desired size   (including alignment_reserve)
  size_t    _refill_waste_limit;                 // hold onto tlab if free() is larger than this
  size_t    _allocated_before_last_gc;           // total bytes allocated up until the last gc

TLAB内部采用碰撞指针方法,

start头指针,end尾指针,分配指针top, 当top撞上end说明TLAB内存分配满了。

_desired_size 是指TLAB的内存大小

_refill_waste_limit 是允许最大浪费空间

占小狼 https://www.jianshu.com/p/cd85098cca39

https://programmer.ink/think/thread-local-cache-tlab-for-jvm-source-analysis.html

Search

    Table of Contents