上一块TLAB虽然被归还到共享内存池了,但是他内部的已使用内存块会存放到新的TLAB中?
时间: 2024-03-29 07:35:51 浏览: 23
不是的。当一个线程的TLAB空间不足时,需要向共享内存池申请更多的内存空间。申请到内存空间后,JVM会为当前线程分配一个新的TLAB,并将其中的可用内存块标记为已使用,以供后续对象的分配使用。这个过程被称为TLAB扩容。
新分配的TLAB只包含可用内存块,已被使用的内存块不会被迁移到新的TLAB中。当一个线程的TLAB被返还到共享内存池时,其中已被使用的内存块会被标记为可用内存块,以供其他线程使用。这些内存块不会被迁移到其他线程的TLAB中,而是会被分配给其他线程的新对象。
需要注意的是,当一个线程的TLAB被返还到共享内存池时,其中已被使用的内存块可能会被其他线程修改,而不是原来的线程。因此,在将TLAB中的可用内存块返还给共享内存池之前,需要将其清空,以避免数据混乱的问题。
相关问题
什么情况下TLAB会被归还给共享内存池
TLAB(Thread Local Allocation Buffer)是一种线程本地内存分配器,它为每个线程分配一块私有的内存区域,用于线程的对象分配。当线程分配对象时,就从自己的TLAB中分配内存,当TLAB中的内存不够时,会向共享内存池申请一定大小的内存,这个过程被称为TLAB扩容。而当一个线程结束时,线程的TLAB会被释放,并将其中的未使用内存块返还给共享内存池,以便其他线程能够使用。
除了线程结束时,TLAB也会在以下情况下被归还给共享内存池:
1. 线程的TLAB空间不足,无法分配对象,需要向共享内存池申请更多的内存。
2. 线程的TLAB内存使用率过低,超过了一定比例(默认为50%),为了避免内存浪费,需要将未使用的内存返还给共享内存池。
3. 程序执行过程中出现了内存抖动(Memory Thrashing)的情况,即程序反复申请和释放内存,导致频繁进行TLAB扩容和回收,这时可以考虑将TLAB的大小设置得更大一些,或者直接禁用TLAB,让所有线程共享同一个内存池。
需要注意的是,TLAB的大小是可以动态调整的,可以根据程序的实际情况进行调整,以达到更好的性能表现。
空间内数据被销毁后为什么要归还给内存池而不是继续使用?归还给内存池后还要再去申请一个新的TLAB
当一个线程的TLAB空间不足时,会向共享内存池申请一定大小的内存,这个过程被称为TLAB扩容。当一个线程的TLAB空间内的对象被释放时,这些空间并不会立即回收,而是保留在TLAB中,以供后续分配对象时使用。当TLAB中的空闲空间超过一定比例时,会将这部分空间返还给共享内存池。
将空间内数据归还给内存池的原因是,这些空间内存可能被其他线程所使用,而不是继续由原来的线程使用。如果这些空间内存被继续使用,可能会引发数据混乱的问题,因此需要将这些空间内存归还给内存池,以便其他线程能够使用。
当一个线程的TLAB被归还给共享内存池后,这个线程需要再次向共享内存池申请一个新的TLAB,以便后续对象的分配。这个过程会增加一定的开销,但是通过使用TLAB可以减少线程之间的锁竞争,提高分配效率,从而对整体性能有所提升。