JVM上的内存分配是无锁的

时间:2011-11-16 06:56:38

标签: java jvm bytecode jvm-hotspot

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

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

2 个答案:

答案 0 :(得分: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中是修复的。

答案 1 :(得分:5)

取决于:)我相信如果您使用-XX:+UseTLAB option(这是Peter所指出的Sun / Oracle JVM的默认设置),由于线程,它将在“快乐路径”中无争用 - 本地堆。当然,如果由于没有足够的空间而需要垃圾收集,我们会进入并行GC等领域,这里有各种各样的实现,而且它们都非常复杂......当然,这一直在不断变化。

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