我在某个地方读到,Java可以在大约12条机器指令内为对象分配内存。这对我来说非常令人印象深刻。据我所知,JVM使用的一个技巧之一是提前分配内存块。这有助于最小化向操作系统发出的请求数量,而这可能是相当昂贵的。但即使CAS操作也可能在现代处理器上耗费多达150个周期。
因此,有人能解释一下Java内存分配的真正成本以及JVM使用哪些技巧加快分配速度吗?
我在某个地方读到,Java可以在大约12条机器指令内为对象分配内存。这对我来说非常令人印象深刻。据我所知,JVM使用的一个技巧之一是提前分配内存块。这有助于最小化向操作系统发出的请求数量,而这可能是相当昂贵的。但即使CAS操作也可能在现代处理器上耗费多达150个周期。
因此,有人能解释一下Java内存分配的真正成本以及JVM使用哪些技巧加快分配速度吗?
JVM 为每个线程预先分配一片内存区域,即线程本地区域 (TLA 或 Thread Local Area)。 当一个线程需要分配内存时,它会在该区域内使用 "Bump the pointer allocation" 策略(如果“空闲指针”指向地址 10,而要分配的对象大小为 50,则我们只需将空闲指针增加到 60,并告诉线程可以使用地址 10 到 59 之间的内存来存储该对象)。