Java堆是所有线程共享的。如果多个线程同时分配对象对堆内存分配指针的并发修改必须加锁。但全局加锁太慢会严重影响吞吐量。JVM的做法是分层处理尽量避免加锁非要加也用最轻的方式。栈上分配最快这是JIT编译器在运行时做的优化依赖逃逸分析。如果一个对象不会逃逸出方法范围——不会作为返回值、不会传给其他线程——JIT会把它拆开直接在虚拟机栈里分配成员变量。栈是线程私有的分配就是挪一下栈顶指针方法结束就自动回收连GC都不需要。TLAB分配主流大部分对象还是要走堆分配的。JVM在Eden区给每个线程留了块专属区域叫TLAB。线程在自己的TLAB里分配通过指针碰撞移动空闲位置就行这是无锁操作。只有TLAB用完了申请新TLAB时才需要同步。CAS分配最终方案如果TLAB不够用或者对象太大线程只能去共享的Eden区了。JVM用CAS而不是重量级锁。读指针、算新值、CAS更新失败了就自旋重试。线程不会被挂起也就没有内核态切换的开销。总结JVM对象分配的分层策略栈上分配— JIT优化逃逸分析完全无开销TLAB分配— 线程本地缓冲无锁分配CAS分配— 共享区无锁更新自旋重试核心思路先挑最快的路走不行再逐级降级。