TLAB的话会归还给内存池还是操作系统
时间: 2023-07-21 12:47:27 浏览: 66
TLAB(Thread Local Allocation Buffer)是一种线程本地内存分配器,它为每个线程分配一块私有的内存区域,用于线程的对象分配。当线程分配对象时,就从自己的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可以减少线程之间的锁竞争,提高分配效率,从而对整体性能有所提升。
阅读全文