JVM创建对象时,堆会发生抢占吗?
有可能会
在JVM中,当多个线程同时执行new操作创建对象时,理论上是存在可能发生堆的抢占情况的。具体是否发生抢占取决于JVM的实现和操作系统的调度策略。
一般情况下,JVM使用了各种机制来确保堆的线程安全性,以避免对堆内存的抢占问题。比如在对象分配的过程中,JVM会为每个线程分配独立的堆内存区域,线程间不会争夺同一块内存区域。这样,在多线程环境中,不同线程可以并行地创建对象,而互不干扰。
然而,如果在某些特殊情况下,多个线程同时请求分配较大内存的对象,而可用的堆内存又非常有限,那么就有可能出现堆内存不足的情况,从而导致线程之间发生竞争和抢占。当堆内存不足时,JVM可能会触发垃圾回收来释放一些不再使用的对象,以腾出足够的内存空间给新的对象分配。
总之,虽然理论上存在堆的抢占可能性,但在正常情况下,JVM的设计和实现通常会通过分配独立的内存区域、使用适当的同步机制等来保证堆的线程安全性,以避免抢占问题的发生。
- 采用 CAS 分配重试的方式来保证更新操作的原子性
- 每个线程在 Java 堆中预先分配一小块内存,也就是本地线程分配缓冲(Thread Local AllocationBuffer,TLAB),要分配内存的线程,先在本地缓冲区中分配,只有本地缓冲区用完了,分配新的缓存区时才需要同步锁定。