栈上分配和TLAB

栈上分配

new的对象大部分是分配在堆空间的,但是也有例外。从jdk6开始,虚拟机默认开启栈上分配,合适的对象就会被分配到栈的栈帧的局部比变量表里上,随着函数的调用结束而死亡,对象在栈上分配可以不用考虑对象的同步,还能减轻GC的压力。

当虚拟机开启了逃逸分析和标量替换之后,如果对象不会逃逸到函数外面,那么对象就会别拆分成很多属性,放到栈中。

逃逸分析就是判断对象会不会逃逸到方法之外,标量替换就是允许将对象拆分成许多小字段。

TLAB

Thread Local Allocation Buffer 即线程本地分配缓冲

给某一线程预留一块待分配的堆空间。

如果不开启TLAB,在线程尝试去申请堆空间的时候,就需要用锁或者CAS解决同步的问题,这样内存的分配效率就会降低。如果开启了TLAB就可以直接分配内存,分配内存的速度会加快。

这个预留的空间是在堆里的,只有分配的时候不用考虑其它线程,但是别的线程还是可以访问的。读写的时候还需要加锁。

分配顺序

小对象的话就会先考虑栈上分配,再考虑TLAB;有些对象太大,不能进行栈上分配和分配到TLAB中。#java#
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务