java - JVM上的内存分配是无锁的吗

标签 java jvm bytecode jvm-hotspot

当你在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/

相关文章:

java - 在 Processing 中获取默认的(屏幕上的)PGraphics 上下文

java - 将 Intent 从一个应用程序广播到另一个应用程序

Eclipse在Windows 7中启动时出错

Scala 泛型 - 为什么我不能在泛型类中创建参数化对象?

java - 如何永久增加java堆内存?

tomcat - 使用 asm 动态生成字节

java - 用 mockito 模拟单例

java - 从一个表中读取行并将其复制到Java中的另一个数据库表中

java - 为什么一根长字符串比许多小字符串占用更多空间?

java - Java中的字节码分析