Java对象的分配原则

很多人都知道Java运行时区域分为5大块(VM stack、heap、method area、native method stack、program counter register),其中 heap(堆空间) 为对象的存储空间。那是否所有对象都存于堆中呢?大家是否知道Java中对象的分配原则呢?

其实Java中的对象并不是全部分配在堆内存区域,也可能分配在栈中。一个对象创建后的分配顺序如下:

1.尝试进行栈上分配(线程私有小对象,对象无逃逸,并且支持标量替换),栈上分配的对象会随着方法结束栈帧弹出而消亡,无需等到GC去清理;

2.栈上分配失败,如果是大对象,则直接分配到堆中Old区;

3.如果是小对象,优先进行线程私有本地分配(Thread Local Allocation Buff(TLAB),文末解释);

4.线程私有本地分配失败,则分配在堆中Young区中的Eden区。

涉及点:

Thread Local Allocation Buff,简称 TLAB,线程私有本地分配。在Eden区中,由于空间是线程共享,会导致多个线程同时去竞争Eden区中位置而降低效率。为了减少这种情况,每个线程会在Eden区中获取一块私有空间(默认1%,JVM参数可调),线程上的私有小对象会优先分配到这里,避免多个线程同时竞争一个位置,提高效率。TLAB也是位于Eden区中。

最后总结以上的对象分配原则可以画出一张图:

Java对象的分配原则_第1张图片

 图片来自于:https://www.processon.com/view/link/623806e75653bb071e724e6b

你可能感兴趣的:(JVM,java)