JVM上的内存分配是否无锁

10

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

我所指的JVM是Hotspot VM。从我所知道的情况来看,它只需要递增一个指针就可以超快速地分配内存。但是在多线程的情况下,该递增操作是否需要加锁或使用CAS呢?

2个回答

6

如前所述,默认情况下使用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中得到了解决。


5

这要看情况而定:) 我认为如果您使用-XX:+UseTLAB选项(正如Peter所说,这是Sun/Oracle JVM的默认选项),由于线程本地堆,它在“happy path”中将无争用。当然,如果垃圾回收需要由于没有足够的空间而进行,我们就会进入并行GC等领域,那里有各种实现,一切都非常复杂... 当然,这一切都在不断发展。

即使在“单堆”模型中,我也希望分配得到高度优化 - 不是像正常情况下获得锁那样,而是尽可能执行原子递增操作。但我不能说我知道细节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接