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