[英]Is memory allocation on the JVM lockless
当你在Java中使用new Object()
时,jvm是否使用无锁算法来分配内存,还是需要锁定?
在这种情况下我指的JVM是Hotspot VM。 从我所知道的一点点来看,它只需要增加一个指针以超快地分配内存。 但是在多线程的情况下,这种增量是否需要锁定或CAS?
如上所述,默认是使用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中是修复的。
这取决于:)我相信如果您使用-XX:+UseTLAB
选项 (这是Peter所指出的Sun / Oracle JVM的默认选项 ),由于线程本地的原因,它将在“快乐路径”中无争用堆。 当然,如果由于没有足够的空间而需要垃圾收集,我们会进入并行GC等领域,这里有各种各样的实现,而且它们都非常复杂......当然,这一直在不断变化。
即使在“单堆”模型中,我也希望分配得到高度优化 - 在正常意义上获取锁定并不是在可能的情况下执行原子增量。 我不能说我知道细节。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.