Java JVM上的内存分配是无锁的吗

Java JVM上的内存分配是无锁的吗,java,jvm,bytecode,jvm-hotspot,Java,Jvm,Bytecode,Jvm Hotspot,在Java中执行new Object()时,jvm是使用无锁算法分配内存还是需要锁定 我在本例中所指的JVM是Hotspot VM。据我所知,它只需要增加一个指针就可以超级快速地分配内存。但是在多线程的情况下,该增量是否需要锁定或CAS?这取决于:)我相信如果使用(正如Peter所指出的,这是Sun/Oracle JVM的默认值),由于线程本地堆,它将在“愉快路径”中无争用。当然,如果由于没有足够的空间而需要进行垃圾收集,我们会进入并行GCs等领域,那里有各种各样的实现,而且都非常复杂。。。当然

在Java中执行
new Object()
时,jvm是使用无锁算法分配内存还是需要锁定

我在本例中所指的JVM是Hotspot VM。据我所知,它只需要增加一个指针就可以超级快速地分配内存。但是在多线程的情况下,该增量是否需要锁定或CAS?

这取决于:)我相信如果使用(正如Peter所指出的,这是Sun/Oracle JVM的默认值),由于线程本地堆,它将在“愉快路径”中无争用。当然,如果由于没有足够的空间而需要进行垃圾收集,我们会进入并行GCs等领域,那里有各种各样的实现,而且都非常复杂。。。当然,这种情况一直在发生


即使在“单堆”模型中,我也希望分配得到高度优化——与其说是获得正常意义上的锁,不如说是在可能的情况下执行原子增量。但是我不能说我知道细节。

如前所述,默认情况下使用tlab。行为的描述如下所示

TLAB
Thread-local allocation buffer. Used to allocate heap space quickly without synchronization. Compiled code has a "fast path" of a few instructions which tries to bump a high-water mark in the current thread's TLAB, successfully allocating an object if the bumped mark falls before a TLAB-specific limit address.
有关在中调整大小的更多详细信息&您可能需要的所有详细信息

简而言之,除非TLAB已满,否则它是线程本地的。在这种情况下,您需要访问共享池,这是一个CAS操作

另一个复杂的因素可能是,描述了卡标记中的错误共享,它本身不是锁,但会影响性能(如果这就是您询问锁的原因的话)。看起来这在java7中是固定的