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技术可以实现快速的对象分配,而不需要任何的锁进行同步,也就是说,在对象分配的时候不用锁住整个堆,而只需要在自己的缓冲区分配即可。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值