是JVM分配还是堆来分配新的TLAB
时间: 2023-12-16 11:27:25 浏览: 29
在HotSpot虚拟机中,JVM会为每个线程分配一个TLAB(线程本地分配缓冲区),TLAB的内存空间是在堆上分配的。当一个线程的TLAB内存空间用满后,JVM会将其中的对象复制到堆上,并销毁该线程的TLAB。如果该线程需要分配新的对象,JVM会为其分配一个新的TLAB,这个新的TLAB仍然是在堆上分配的。因此,在HotSpot虚拟机中,分配新的TLAB是由JVM在堆上进行分配的。
相关问题
我了解的TLAB的空间用满了后线程会将TLAB中对象的数据复制到 堆中并销毁TLAB,然后再找堆申请一块新的TLAB。你说的是JVM会继续分配对象到堆上。这时候会使用全局的分配器,也就是在堆上进行分配,而不是在TLAB上进行。
非常抱歉,我理解有误,您所说的是正确的。当一个线程的TLAB空间被用满后,JVM会将其中的对象复制到堆上,并销毁该线程的TLAB。如果该线程需要分配新的对象,JVM会为其分配一个新的TLAB。如果创建新的TLAB失败,线程会在堆上分配对象。这时候会使用全局的分配器,在堆上进行分配,而不是在TLAB上进行。由于在堆上进行分配需要搜索可用的内存块,因此分配速度会变慢。同时,在堆上分配对象也会增加垃圾收集的负担,因为分配在堆上的对象需要经过一次额外的垃圾收集才能被回收。所以,合理地设置TLAB的大小可以减少在堆上分配对象的数量,从而提高分配速度和垃圾回收效率。
那么新的TLAB是不是需要对所有对象都分配一遍内存
不是的。当一个线程的TLAB空间不足时,需要向共享内存池申请更多的内存空间。申请到内存空间后,JVM会为当前线程分配一个新的TLAB,并将其中的可用内存块标记为已使用,以供后续对象的分配使用。这个过程被称为TLAB扩容。
在这个过程中,已经为对象分配好的内存块并不需要再次分配。因为这些内存块已经被标记为已使用,当前线程无法再次占用它们。新分配的TLAB只包含可用内存块,需要等到这些内存块被分配给对象后,才会被标记为已使用。
需要注意的是,TLAB的大小是可以动态调整的,可以根据程序的实际情况进行调整,以达到更好的性能表现。如果一个线程的TLAB过大,会导致内存浪费,影响程序的性能。如果一个线程的TLAB过小,则会导致频繁进行TLAB扩容和回收,降低程序的性能。因此,需要根据实际情况进行调整,以达到最佳的性能表现。