2011-11-16 21 views
10

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

在这种情况下,我指的JVM是Hotspot VM。从我所知道的很少,它只需要增加一个指针来分配超快的内存。但是在多线程的情况下,增量是否需要锁定或CAS?

回答

6

如前所述,默认是使用tlab。该品行在this glossary如下

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. 

this blog &所有的细节大小,你可以想在this blog进一步的细节描述。

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

另一个复杂因素可能是this bug,它描述了卡片标记中的错误共享,这不是锁定,但会损害性能(如果这是您要求锁定的原因)。它看起来像是在java7中修复的。

5

这取决于:)我相信如果您使用-XX:+UseTLAB option(这是Sun指定的Sun/Oracle JVM的默认值),由于线程局部堆栈,它将在“开心路径”中无竞争。当然,如果由于没有足够的空间而需要垃圾回收,我们会进入并行GC等领域,在那里有各种各样的实现,并且它们都非常复杂......当然,这一切都是随时都在发生。

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

+1

+1:默认情况下,Sun/Oracle JVM上的UseTLAB处于打开状态。 –

+0

@PeterLawrey:谢谢 - 编辑得当。 –