对象分配流程_以及_栈分配与TLAB的区别
一. 回顾
前面了解了jvm中的逃逸分析和jvm中的TLAB,今天对两者的区别进行分析。
参考自:关于栈上分配和TLAB的理解
此笔记仅供自己参考,如有错误请指正
二. 区别
2.1 栈分配
栈分配是属于逃逸分析里面的,详情见jvm中的逃逸分析。当一个对象没有逃离当前方法或线程,其生命周期与方法一致,随着栈帧出栈而销毁,那么我们jvm的逃逸分析技术则不将该对象分配在堆中,而是分配在栈中(即栈分配
),将对象分解成成员标量存在栈中。 栈帧出栈则自行销毁,无需GC回收垃圾,减轻GC压力。
2.2 TLAB
堆是一个全局共享的区域,多个线程同一时刻创建对象,会存在同步问题(即指针碰撞,详情见Java的指针碰撞简介)。 同步问题导致效率降低。因此出现了TLAB,每个线程都有自己的TLAB,创建对象的时候则无需担心出现多个线程同一时刻申请同一内存区域(即无需担心指针碰撞)。TLAB是线程私有的,仅限于申请内存是私有的,其他线程是能访问其他线程的TLAB里面的对象。
2.3 总结
分配方式 | 针对 | 处于对象分配流程的位置 |
---|---|---|
栈分配 | 减轻GC压力,避免无谓负担 | 1 |
TLAB分配 | 加速堆上对象的分配 | 2 |