JVM常用概念之线程本地分配缓冲区(ThreadLocal Allocation Buffer,TLAB)
当实例化一个Java类时,运行时环境必须为相关实例分配存储空间,在JRE中此存储空间分配操作是由内存管理器实现的(其实是JVM的垃圾回收器),由于内存管理器通常使用与运行时目标语言不同的语言编写(例如,Java 以 JVM 为目标,而 HotSpot JVM 是用 C++ 编写的),因此接口会变得更加模糊。而这种操作成本是相当高的,并且内存管理器也必须应对多线程场景下进行内存请求的压力。为了使Java程序的运行效率尽可能接近C++等语言的运行效率,针对JVM的内存管理器的执行效率需要进行优化。
1.优化方法
优化方法如允许线程分配整个内存块以满足其需求,并且只传输到 VM 以获取新块。在 Hotspot 中,这些块称为线程本地分配缓冲区 (TLAB),并且有一个复杂的机制来支持它们。请注意,TLAB 在时间意义上是线程本地的,这意味着它们像缓冲区一样接受当前分配。它们仍然是 Java 堆的一部分,线程仍然可以将对新分配对象的引用写入 TLAB 之外的字段等等。
所有已知的 OpenJDK GC 都支持 TLAB 分配。VM 代码的这一部分在它们之间基本是共享的。所有 Hotspot 编译器都支持 TLAB 分配,因此您通常会看到如下所示的对象分配生成代码:
0x00007f3e6bb617cc: mov 0x60(%r15),%rax ; TLAB "current"
0x00007f3e6bb617d0: mov %rax,%r10 ; tmp = current
0x00007f3e6bb617d3: add $0x10,%r10 ; tmp += 16 (object size)
0x00007f3e6bb617d7: cmp 0x70(%r15),%r10 ; tmp > tlab_size?
0x00007f3e6bb617db: jae 0x00007f3e6bb61807 ; TLAB is done, jump and request another one
0x00007f3e6bb617dd: mov %r10,0x60(%r15) ; current = tmp (TLAB is fine, alloc!)
0x00007f3e6bb617e1: prefetchnta 0xc0(%r10) ; ...
0x00007f3e6bb617e9: movq $0x1,(%rax) ; store header to (obj+0)
0x00007f3e6bb617f0: movl $0xf80001dd,0x8(%rax) ; store klass to (obj+8)
0x00007f3e6bb617f7: mov %r12d,0xc(%rax) ; zero out the rest of the object
2.指针碰撞分配
分配路径内联在生成的代码中,因此不需要调用 GC 来分配对象。如果我们请求分配耗尽了 TLAB 的对象,或者对象足够大而无法放入 TLAB,那么我们将采取“慢速路径”,要么在那里满足分配,要么返回新的 TLAB。请注意,最常见的“正常”路径只是将对象大小添加到 TLAB 当前光标,然后继续。
这就是为什么这种分配机制有时被称为“指针碰撞分配”。指针碰撞需要分配一块连续的内存,但这又带来了堆压缩的需要。请注意 CMS 如何在“老”代中进行空闲列表分配,从而实现并发清除,但它压缩了STW情况下堆中的“年轻代”集合,这受益于指针碰撞分配!年轻代集合中幸存下来的对象数量要少得多,这就是空闲列表分配的代价。
为了进行实验,我们可以使用 -XX:-UseTLAB 关闭 TLAB 功能。然后,所有分配都将进入本机方法,通常不建议这么做,如下所示:
- 17.12% 0.00% org.openjdk.All perf-31615.map- 0x7faaa3b2d125- 16.59% OptoRuntime::new_instance_C- 11.49% InstanceKlass::allocate_instance2.33% BlahBlahBlahCollectedHeap::mem_allocate <---- entry point to GC0.35% AllocTracer::send_allocation_outside_tlab_event
3.总结
TLAB 是内存分配机制的主力:它们消除了分配器的并发瓶颈,提供了廉价的分配路径,并全面提高了性能。有趣的是,使用 TLAB 会导致更频繁的 GC ,只是因为内存分配非常便宜!相反,在任何内存管理器实现中没有快速分配路径肯定会隐藏内存回收性能问题,从而严重的影响JVM的性能。
相关文章:
JVM常用概念之线程本地分配缓冲区(ThreadLocal Allocation Buffer,TLAB)
当实例化一个Java类时,运行时环境必须为相关实例分配存储空间,在JRE中此存储空间分配操作是由内存管理器实现的(其实是JVM的垃圾回收器),由于内存管理器通常使用与运行时目标语言不同的语言编写(例如&#…...

大模型生成的常见Top-k、Top-p、Temperature参数
参考: https://zhuanlan.zhihu.com/p/669661536 topK,topP https://www.douyin.com/video/7380126984573127945 主要是softmax产生的词表每个词的概率分布后, topK,比如K3,表示采样概率最大的前3个,其他全…...

ppt添加圆角矩形,并调整圆角弧度方法
一、背景 我们看的论文,许多好看的图都是用PPT做的,下面介绍用ppt添加圆角矩形,并调整圆角弧度方法。 二、ppt添加圆角矩形,并调整圆角弧度 添加矩形: 在顶部工具栏中,点击“插入”选项卡。 在“插图”…...
测评要求+基本措施+对应产品
基本要求项测评项基本措施对应产品 网络架构 网络架构 网络架构应保证网络各个部分的带宽满足业务高峰期需要;带宽管理流量控制系统 网络架构 网络架构 网络架构应避免将重要网络区域部署在边界处,重要网络区域与其他网络区域之间应采取可靠的技术隔离手…...

什么是git?
前言 Git 是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。是的,我对git的介绍就一条,想看简介的可以去百度一下😘😘😘 为什么要用git? OK,想象一下…...

C/C++中内存开辟与柔性数组
C/C中内存的开辟 在C中,我们都知道有三个区: 1. 栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结 束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指…...
编程App软件优化是什么
编程App软件优化是什么 在数字化时代,编程App软件已成为我们日常生活和工作中不可或缺的一部分。然而,随着技术的不断进步和用户需求的日益多样化,如何对编程App软件进行优化,以提供更高效、更流畅的用户体验,成为了开…...

爱了爱了,11款超良心App推荐!
AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/今天,我们向你推荐十款与众不同但又不错的win10软件,它们都有各自的功能和优点,相信你一定会喜欢。 1.图片处…...
Linux基础指令(二)(文件、权限等)
目录 普通文件的操作 touch cat 翻页 标准输出重定向: 标准输出重定向种类: 管道符:| 压缩指令: zip gzip tar Linux下最常见的打包指令 其他系统指令: 快捷…...

爆火的治愈系插画工具又来了,额度居然有18w,根本花不完?
AI治愈插画又又又来了 今天给大家推荐一款完全免费的软件,用过的人都说好! 先来看看我生成的图 制作过程非常简单,输入你想要生成的画面咒语。 工具地址:https://www.qiyuai.net/ 模型目前有两种 我上面的图就是用的第一种通用…...
Qt 实战(4)信号与槽 | 4.3、信号连接信号
文章目录 一、信号连接信号1、什么是信号连接信号?2、如何实现信号连接信号3、总结 前言: 在Qt框架中,信号与槽(Signals and Slots)机制是对象间通信的核心。通常情况下,我们习惯于将信号连接到槽函数上&am…...

Day 16:3040. 相同分数的最大操作数目II
Leetcode 相同分数的最大操作数目II 给你一个整数数组 nums ,如果 nums 至少 包含 2 个元素,你可以执行以下操作中的 任意 一个: 选择 nums 中最前面两个元素并且删除它们。选择 nums 中最后两个元素并且删除它们。选择 nums 中第一个和最后一…...
Go基础编程 - 07 - 字典(map)及其约束
字典(map) 下一篇:结构体1. 声明2. nil 值字典3. 判断某个键是否存在4. 遍历5. delete() 删除键值对6. 约束7. 扩展 上一篇:指针 下一篇:结构体 map 是一种无序的基于 key-value 的数据结构,Go 语言中的 …...

WebSocket 快速入门 与 应用
WebSocket 是一种在 Web 应用程序中实现实时、双向通信的技术。它允许客户端和服务器之间建立持久性的连接,以便可以在两者之间双向传输数据。 以下是 WebSocket 的一些关键特点和工作原理: 0.特点: 双向通信:WebSocket 允许服务…...
使用Spring Cloud设计电商系统架构
在当今互联网高速发展的时代,电子商务系统成为了商家与用户互动的主要方式之一。为了能够更好地应对高并发、可扩展性、灵活性等需求,微服务架构逐渐成为设计电商系统的首选方案。Spring Cloud作为一个成熟的微服务框架,为开发人员提供了一整…...
揭开 Docker 容器的神秘面纱:深入理解容器原理
前言 前几年比较火的是微服务,再然后就是云。讨论技术必谈微服务,要上云,开发出的产品也都是某某云。现在讨论比较少了,因为AI盖过他们。还有就是因为容器技术,现在几乎都是k8s,云原生。要比较快的上手k8s…...

Elasticsearch:Open Crawler 发布技术预览版
作者:来自 Elastic Navarone Feekery 多年来,Elastic 已经经历了几次 Crawler 迭代。最初是 Swiftype 的 Site Search,后来发展成为 App Search Crawler,最近又发展成为 Elastic Crawler。这些 Crawler 功能丰富,允许以…...

C 语言连接MySQL 数据库
前提条件 本机安装MySQL 8 数据库 整体步骤 第一步:开启Windows 子系统安装Ubuntu 22.04.4,安装MySQL 数据库第三方库执行 如下命令: sudo aptitude install libmysqlclient-dev wz2012LAPTOP-8R0KHL88:/mnt/e/vsCode/cpro$ sudo aptit…...

【探索Linux】P.34(HTTPS协议)
阅读导航 引言一、HTTPS是什么1. 什么是"加密"2. 为什么要加密3. 常见的加密方式(1)对称加密(2)非对称加密 二、证书认证1. CA认证 三、HTTPS的加密底层原理✅非对称加密对称加密证书认证 温馨提示 引言 在上一篇文章中…...

Python 踩坑记 -- 调优
前言 继续解决问题 慢 一个服务运行有点慢,当然 Python 本身不快,如果再编码不当那这个可能就是量级上的劣化。 整个 Code 主线逻辑 1700,各依赖封装 3000,主线逻辑也是很久远的痕迹,长函数都很难看清楚一个 if els…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...

sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...