我读过某个地方,Java可以在大约12条机器指令中为对象分配内存。这对我来说非常令人印象深刻。据我了解,JVM使用的技巧之一是按块预分配内存。我认为,这有助于最大程度地减少对操作系统的请求数量,这是非常昂贵的。但是,即使是CAS操作,在现代处理器上也可能要花费多达150个周期。
那么,谁能在Java中解释内存分配的实际成本以及JVM使用哪些技巧来加快分配速度?
JVM为每个线程预分配一个内存区域(TLA或线程本地区域)。当线程需要分配内存时,它将在该区域内使用“跳转指针分配”。(如果“空闲指针”指向地址10,并且要分配的对象的大小为50,那么我们只需将空闲指针增大到60,然后告诉线程它可以使用10到59之间的内存作为对象) 。