当您new Object()
在Java中执行a时,jvm是使用无锁算法分配内存还是需要锁定?
在这种情况下,我所指的 JVM 是 Hotspot VM。据我所知,它只需要增加一个指针来超快速地分配内存。但是在多线程的情况下,这个增量是否需要锁定或 CAS?
当您new Object()
在Java中执行a时,jvm是使用无锁算法分配内存还是需要锁定?
在这种情况下,我所指的 JVM 是 Hotspot VM。据我所知,它只需要增加一个指针来超快速地分配内存。但是在多线程的情况下,这个增量是否需要锁定或 CAS?
如前所述,默认是使用 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中是固定的。
这取决于:) 我相信如果您使用该-XX:+UseTLAB
选项(这是 Peter 指出的 Sun/Oracle JVM 的默认选项),由于线程本地堆,它将在“快乐路径”中无争用。当然,如果由于没有足够的空间而需要进行垃圾收集,我们就会进入并行 GC 等领域,那里有各种实现,而且都非常复杂……当然,这一直在进行。
即使在“单堆”模型中,我也希望分配得到高度优化——与其说是获取正常意义上的锁,不如说是在可能的情况下执行原子增量。我不能说我知道细节。