JVM堆分配中TLAB分配方案

news2024/9/23 11:18:39

个人博客

JVM堆分配中TLAB分配方案 | iwts’s blog

Java对象的内存分配过程如何保证线程安全

对象的内存分配过程中,主要流程是将对象的引用指向一个具体的内存区域,然后进行初始化操作。

但是,因为堆是全局共享的,因此在同一时间,可能有多个线程在堆上申请空间,那么,在并发场景中,可能出现两个线程先后把对象引用指向了同一个内存区域这样的情况。

为了解决这个并发问题,对象的内存分配过程就必须进行同步控制。但是加锁/CAS,本质上都会影响内存的分配效率。

那么在HotSpot虚拟机中就实现了不涉及同步的解决方案,即TLAB。

TLAB分配方案

Thread Local Allocation Buffer。其主要概念是:

  1. 每个线程在Java堆中预先分配一小块内存。

  2. 给对象分配内存的时候,直接在自己这块“私有”内存中分配。

    a> 当这部分区域用完之后,再分配新的“私有”内存。

而预先分配的这一小块内存,即TLAB,是从堆的Eden区中划分出来的,但是是某个线程独享的。

在虚拟机的TLAB功能启动的情况下,在线程初始化时,虚拟机会为每个线程分配一块TLAB空间,只给当前线程使用,这样每个线程都单独拥有一个空间,如果需要分配内存,就在自己的空间上分配,这样就不存在竞争的情况,可以大大提升分配效率。

TLAB非分配时公有

这里值得注意的是,我们说TLAB是线程独享的,但是只是在“分配”这个动作上是线程独享的,至于在读取、GC等动作上都是线程共享的。而且在使用上也没有什么区别。

也就是说,虽然每个线程在初始化时都会去堆内存中申请一块TLAB,并不是说这个TLAB区域的内存其他线程就完全无法访问了,其他线程的读取还是可以的,只不过无法在这个区域中分配内存而已。

TLAB的GC

在TLAB分配之后,并不影响对象的移动和回收,也就是说,虽然对象刚开始可能通过TLAB分配内存,存放在Eden区,但是还是会被GC掉或者被移到Survivor Space、Old Gen等分区中。

大对象在TLAB下的分配

TLAB是在Eden区分配的,但是因为Eden区域本身就不太大,而且TLAB空间的内存也非常小,TLAB在默认情况下仅占有整个Eden空间的1%。

所以,如果是大对象,那么本身是无法在TLAB区直接分配的。

那么这个时候还是可能只在Eden区或者老年代进行分配的,但是这种分配就需要进行同步控制了。

这也是大对象分配比较慢的原因,大对象不能利用TLAB隔离线程,所以只能通过锁等机制保证并发下的同步,所以速度相对小对象的创建要慢不少。

TLAB最大浪费空间

上面也聊过,本来Eden区就小,TLAB更小,那么分配的时候可能经常会碰到扩容的问题。例如:

  1. 线程的TLAB空间100kb,已经使用了80kb。
  2. 此时需要分配一个30kb的对象。
  3. TLAB空间不足。

那么这个时候有两个选择:

  1. 放弃TLAB,跟大对象一样直接堆内分配。

    a> 如果只剩下1kb,那么后续的对象几乎都是在堆内分配,失去了TLAB的意义。

  2. 放弃当前TLAB,申请一块新的TLAB。

    a> TLAB在划分时还是要同步的,如果频繁重新申请TLAB,那么同步操作次数也会多很多,本身性能也会下降。

JVM则提出了最大浪费空间(refill_waste)的概念,用以综合上面两种选择:

当请求分配的内存大于refill_waste的时候,会选择在堆内存中分配。若小于refill_waste值,则会废弃当前TLAB,重新创建TLAB进行对象内存分配。

依旧是上面的例子:

  1. TLAB总共100kb,使用了80kb,剩余20kb

  2. 设置refill_waste=25kb

  3. 那么有这样的场景:

    a> 新对象20kb,恰好分配。

    b> 新对象23kb,<25kb,那么放弃TLAB,直接申请一块新TLAB空间并分配

    c> 新对象30kb,>25kb,直接走大对象堆分配。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1698572.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图像处理ASIC设计方法 笔记24 等价表和标记代换

(一)等价表的整理与压缩 1.1 等价关系的识别与追踪 在初步标记过程完成后,等价表的整理和压缩变得至关重要。这一阶段的首要任务是从等价表的地址1开始,对等价表进行逐个扫描。在扫描过程中,系统将检查每个临时标记是否存在等价关系。若发现等价关系,系统将执行追踪过程,…

9.js函数

函数是js复杂数据类型的一种---可以理解为存放代码的盒子 用来帮助我们封装、复用、扩展以及调用代码的工具 函数的两个阶段 &#xff08;1&#xff09;声明函数&#xff08;理解为创造&#xff09; ——声明式声明 语法&#xff1a;function 函数名(参数){...代码} ——赋值时…

for循环里如果std::pair的类型写不对,可能会造成性能损失

第一版 std::map<int, int> t;t.emplace(1, 1);for (const std::pair<int,int>& data : t){int i 0;std::ignore i;}中间留一些空格&#xff0c;是因为ms在调试的时候&#xff0c;尤其是模板比较多的时候&#xff0c;经常断点的行号有问题。比如第5行的断点&…

Linux服务的简介与分类

服务的简介与分类 服务的分类 查询已安装的服务和区分服务 #列出所有rpm包默认安装服务的自启动状态 [rootlocalhost ~]# chkconfig --list atd atd 0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭 [rootlocalhost ~]# chkconfig --list sshd sshd …

从零起航,Python编程全攻略

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、Python入门之旅 二、Python进阶之道 三、Python爬虫实战 四、Python数据分析利器 五…

【已解决】在jupyter里运行torch.cuda.is_available(),显示True,在pycharm中运行却显示false。

文章目录 问题概述1、在Jupyter中GPU运行true2、在pycharm中GPU运行false3、个人解决方案仅供参考 问题概述 在jupyter里运行torch.cuda.is_available()&#xff0c;显示True&#xff0c;在pycharm中运行却显示false。原因在于jupyter 运行环境和pycharm 运行环境不同&#xf…

Nginx配置文件简介与配置实例(负载均衡、动静分离、高可用集群)- 细节狂魔

文章目录 前言Nginx配置文件组成Nginx配置文件三个部分第一部分&#xff1a;全局块第二部分&#xff1a;events 块第三部分&#xff1a;http 块http 全局块server 块location 块 Nginx 配置实例实例1 - 反向代理预期实现效果具体实现 实例2 - 反向代理实现效果准备工作一&#…

SVN创建分支,分支合并,切换分支。通俗易懂

1、首先在svnbucket.com远程仓库上创建项目&#xff0c;这里我创建了个测试demo&#xff1a; 2、先把svn仓库的项目检出到自己的文件夹&#xff0c;我这里是demo001文件夹&#xff0c;此时并没有创建truck, branches, tags这三个目录&#xff1a; 3、 在demo001文件夹里新建tru…

民国漫画杂志《时代漫画》第22期.PDF

时代漫画22.PDF: https://url03.ctfile.com/f/1779803-1248634856-2c7010?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

闲置商标转让出现这些状态时注意!

近日以前做转让的一个朋友的商标转让证明下来&#xff0c;正好是2个半月&#xff0c;普推知产老杨发现这个时间也太快&#xff0c;以前差不多四个月左右&#xff0c;有些朋友需要购买闲置商标&#xff0c;3个月内所有权就变成自己的。 在购买闲置商标时要注意有一些细节&#x…

民国漫画杂志《时代漫画》第23期.PDF

时代漫画23.PDF: https://url03.ctfile.com/f/1779803-1248634922-4eafac?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

斯坦福2024人工智能指数报告 1

《人工智能指数报告》由斯坦福大学、AI指数指导委员会及业内众多大佬Raymond Perrault、Erik Brynjolfsson 、James Manyika、Jack Clark等人员和组织合著&#xff0c;旨在追踪、整理、提炼并可视化与人工智能&#xff08;AI&#xff09;相关各类数据&#xff0c;该报告已被大多…

【学习笔记】Windows GDI绘图(七)图形路径GraphicsPath详解(下)

文章目录 前三篇回顾GraphicsPath方法Flatten压平(将曲线转成线段)GetBounds获取外接矩形GetLastPoint获取路径最后一个点IsOutlineVisibleIsVisiable是否在轮廓上或内部Reset重置Reverse逆转点的顺序Transform矩阵变换Wrap扭曲变换Widen将路径替换为指定画笔的填充区域 前三篇…

Leetcode42题:接雨水

1.题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,…

一、Servlet和JSP技术概述

注&#xff1a;该系列笔记是用于我在 《Servlet 与 JSP 核心编程》这本书中的学习笔记&#xff0c;无其他意思&#xff0c;侵权请联系2082045221qq.com删除。 ​ 第一章内容较少&#xff0c;所以暂时有用的笔记也不多。 1.1、Servlet 的功用&#xff1a; ​ Servlet 是运行在…

小白入职 必要熟悉 Git / tortoiseGit 工具

1.安装Git 1.1 了解Git Git是分布式版本控制系统&#xff0c;没有中央服务器的每个人的电脑就是一个完整的版本库&#xff0c;工作时无需联网可多人协作&#xff0c;只需把各自的修改推送给对方&#xff0c;就可以互相看到对方的修改了 分布式版本控制工具管理方式&#xff…

【FPGA】Verilog:奇校验位生成器的实现(Odd Parity bit generator)

解释奇数奇偶校验位生成器和检查器的仿真结果及过程。 真值表和卡洛图: Odd Parity Bit Generator A B C

【LeetCode刷题】滑动窗口思想解决:最大连续1的个数 III、将x减到0的最小操作数

【LeetCode刷题】Day 8 题目1&#xff1a;1004.最大连续1的个数 III思路分析&#xff1a;思路1&#xff1a;暴力枚举zero计数器思路2&#xff1a;滑动窗口zero计数器 题目2&#xff1a;1658. 将x减到0的最小操作数思路分析&#xff1a;思路1&#xff1a;暴力枚举思路2&#xff…

链式二叉树的前,中,后序遍历 AND 结点个数及高度等 文末附带全部代码

目录 前言1. 前序遍历2. 中序遍历3. 后续遍历4. 二叉树结点的个数5. 二叉树叶子结点个数6. 二叉树的高度7. 二叉树第K层结点的个数8. 二叉树查找值为x的结点全部代码总结 正文开始 前言 本文旨在介绍二叉树的链式存储中一些函数的实现 博客主页: 酷酷学!!! 更多文章, 期待关…

​✨聚梦AI绘图插件-for photoshop(基于ComfyUI) 内测版V0.1发布

&#x1f388;背景 photoshop本身是有AI生成能力的&#xff0c;不过限于种种原因&#xff0c;国内使用很不方便。 photoshop也是有AI插件的&#xff0c;不过大多安装起来比较复杂&#xff0c;或者&#xff0c;干脆就会收费。 所以我们做了一个免费的AI插件&#xff0c;期望能…