JVM 线程本地分配缓存TLAB
创始人
2024-05-24 03:19:02
0

什么是TLAB

从内存模型而不是垃圾收集的角度,对 Eden 区域继续进行划分,JVM 为每个线程分配了一个私有缓存区域,它包含在 Eden 空间内

多线程同时分配内存时,使用 TLAB 可以避免一系列的非线程安全问题,同时还能提升内存分配的吞吐量,因此我们可以将这种内存分配方式称为快速分配策略
在这里插入图片描述

为什么需要tlab

在jvm中堆区是共享的区域,一旦在并发环境下从堆中划分内存空间,就可能会遇到分配到同一个内存地址的问题,为了避免多个线程操作同一个地址,就需要使用加锁等机制,但这会影响分配速度,因此使用tlab可以避免在多线程分配内存时的非线程安全问题,同时还能提升内存分配的吞吐量。

尽管不是所有的对象实例都能在tlab中成功分配,但jvm确实是将tlab作为内存分配的首选项,一旦分配失败,jvm就会尝试着通过使用加锁机制确保数据操作的原子性,从而直接在Eden空间中分配内存。

常见问题

1、tlab跟java程序的多线程控制什么关系,java程序在多线程环境下不控制线程安全也可以最终线程安全吗?
答:跟java代码中的多线程安全无关系,这里只是指多线程下在堆空间中对对象的内存分配安全问题。

2、为什么多线程环境下分配内存会出现线程安全问题?
Java 程序会极其频繁的创建对象并为对象分配内存空间,一般情况下对象是分配在堆上的,堆又是全局共享的,所以会存在多个线程同时在堆上申请空间,而堆要同步处理,导致性能下降,而且同时为多个线程分配内存又可能会存在多个线程抢占一个内存地址的问题。
那么为了解决这一问题,Java 虚拟机提供了 TLAB 分配。TLAB 全称是 Thread Local Allocation Buffer,线程本地分配缓存,是一个线程私有的内存分配区域。虚拟机在 eden 区为每一个线程分配一块线程专用的内存区域 TLAB 区域。这样多个线程同时在堆上申请空间时,可以直接在当前线程自己的 TLAB 区域分配对象,不必等待堆同步处理,提高了效率。

3、什么时候tlab分配成功,什么时候分配失败?
由于tlab总空间只有eden空间大小的1%,因此当需要分配的对象内存大小太大,不足以放进tlab时,就会出现分配失败的情况下,就会由分配到非tlab的eden空间中,如果eden空间也不够大(此时幸存者区一般也不够),就会直接到老年代区去。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...