bump-the-pointer 和 TLABs 机制

JVM的GC用到了一些加速内存分配的技术,简单总结如下

bump-the-pointer机制:

原介绍:

That is, the end of the previously allocated object is always kept track of. When a new allocation request needs to be satisfied, all that needs to be done is to check whether the object will fit in the remaining part of the generation and, if so, to update the pointer and initialize the object.

顾名思义,bump-the-pointer机制会跟踪在eden区穿件的最后一个对象,最后创建对象会放在eden顶部。之后再创建对象,秩序检查eden空间是否足够,这样每次创建都只需要检查最后一个创建对象。

但多线程条件下,就会出现问题,如果加锁,开销太大,因此有了TLABs

TLABs(Thread-Loacl Allocatiuon Buffers):

原介绍:

The HotSpot JVM has adopted a technique called Thread-Local Allocation Buffers (TLABs). This improves multithreaded allocation throughput by giving each thread its own buffer (i.e., a small portion of the generation) from which to allocate. Since only one thread can be allocating into each TLAB, allocation can take place quickly by utilizing the bump-the-pointer technique, without requiring any locking. 
Only infrequently, when a thread fills up its TLAB and needs to get a new one, must synchronization be utilized. Several techniques to minimize space wastage due to the use of TLABs are employed.

TLABs其实就是为每个线程在eden区分配已开独立Buffer,每个线程隔离开,不需要和其他线程交互,自然可以使用bump-the-point,当线程各自的Buffer满了之后需要申请新的Buffer

TLAB默认设定为占用Eden Space的1%。在Java程序中很多对象都是小对象,且用过即丢,它们不存在线程共享,适合被快速GC,所以对于小对象通常JVM会优先分配在TLAB上,并且TLAB上的分配由于是线程私有所以没有锁开销。因此在实践中分配多个小对象的效率通常比分配一个大对象的效率要高。
TLAB(Thread-local allocation buffer)可以理解为Java的缓冲区,每个TLAB都只有一个线程可以操作,TLAB结合bump-the-pointer技术可以实现快速的对象分配,而不需要任何的锁进行同步,也就是说,在对象分配的时候不用锁住整个堆,而只需要在自己的缓冲区分配即可。

 

你可能感兴趣的:(JVM)