看下图:
1.首先看是否满足栈分配的条件,如果满足则在栈上分配,在栈上分配对象要比在堆上分配对象快得多
2.如果栈分配条件不满足,则进入堆中,判断是否可以分配在TLAB上,TLAB 的全称是 Thread Local Allocation Buffer,JVM 默认给每个线程在 Eden 区中开辟一个 buffer 区域,默认占用 1%Eden 的空间,用来加速对象分配,这个道理和 Java 语言中的 ThreadLocal 类似,避免了对公共区的操作,以及一些锁竞争
3.如果没有在TLAB上分配,则判断该对象是否是大对象,如果是大对象则直接分配在老年代
4.以上三个条件都不满足,则分配在Eden区
希望以上的解答能帮助到你!
你这里理解的共享跟私有有点不一样,java栈,本地方法栈,寄存器是线程私有的是指每个线程都会有一个独立的,生命周期随着线程的创建而创建,死亡而死亡。堆是共享的,不是说他里面的对象就是大家都可以随便访问,全部线程共享,只是说堆里面的内存是全部线程共享的。方法内创建的对象,还是存放在堆里面,调用对象都是通过对象的引用去访问对象。为什么能私有呢,就是因为它的引用只有在你该线程的栈中有。
知道对象在堆中的地址,用unsafe可以只到拿这个对象也说不准。