当你在Java中做一个new Object()
时,jvm是使用无锁算法分配内存还是需要加锁?
在这种情况下,我指的 JVM 是 Hotspot VM。据我所知,它只需要递增一个指针即可超快地分配内存。但是在多线程的情况下,这个增量是否需要加锁或者CAS?
最佳答案
如前所述,默认是使用 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 中已修复。
关于java - JVM上的内存分配是无锁的吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8147846/