Java 非阻塞内存分配
2022-09-03 18:22:45
我在某处读到,java可以在大约12条机器指令中为对象分配内存。这对我来说令人印象深刻。据我所知,JVM使用的技巧之一是以块为单位预先分配内存。这有助于最大限度地减少对操作系统的请求数量,我想这是非常昂贵的。但是,即使是 CAS 操作,在现代处理器上也可能花费高达 150 个周期。
那么,谁能解释一下Java中内存分配的实际成本,以及JVM使用哪些技巧来加快分配速度?
我在某处读到,java可以在大约12条机器指令中为对象分配内存。这对我来说令人印象深刻。据我所知,JVM使用的技巧之一是以块为单位预先分配内存。这有助于最大限度地减少对操作系统的请求数量,我想这是非常昂贵的。但是,即使是 CAS 操作,在现代处理器上也可能花费高达 150 个周期。
那么,谁能解释一下Java中内存分配的实际成本,以及JVM使用哪些技巧来加快分配速度?
JVM 为每个线程(TLA 或线程本地区域)预先分配一个内存区域。当线程需要分配内存时,它将在该区域中使用“碰撞指针分配”。(如果“free pointer”指向地址 10,并且要分配的对象大小为 50,那么我们只需将 free 指针提升到 60,并告诉线程它可以对对象使用 10 到 59 之间的内存)。
最好的诀窍是代际垃圾收集器。这将使堆保持未碎片,因此分配内存会增加指向可用空间的指针并返回旧值。如果内存用完,垃圾回收会复制对象并以这种方式创建新的未碎片堆。
由于不同的线程必须通过指向可用内存的指针进行同步,因此如果增加它,它们将预先分配块。因此,线程可以分配新内存,而无需锁定。
所有这些都在这里有更详细的解释:http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html