java ema算法_全网最硬核 JVM TLAB 分析 3. JVM EMA期望算法与TLAB相关JVM启动参数
6. JVM 中的期望计算 EMA
在上面提到的 TLAB 大小设计的时候,我们经常提到期望。这个期望是根据历史数据计算得出的,也就是每次输入采样值,根据历史采样值得出最新的期望值。不仅 TLAB 用到了这种期望计算,GC 和 JIT 等等 JVM 机制中都用到了。这里我们来看一种 TLAB 中经常用到的 EMA(Exponential Moving Average 指数平均数) 算法:
EMA 算法的核心在于设置合适的最小权重,我们假设一个场景:首先采样100个 100(算法中的前 100 个是为了排除不稳定的干扰,我们这里直接忽略前 100 个采样),之后采样 50 个 2,最后采样 50 个 200,对于不同的最小权重,来看一下变化曲线。
可以看出,最小权重越大,变化得越快,受历史数据影响越小。根据应用设置合适的最小权重,可以让你的期望更加理想。
这块对应的源代码:gcUtil.hpp 的 AdaptiveWeightedAverage 类。
7. TLAB 相关的 JVM 参数
这里仅仅是列出来,并附上简介,看不懂没关系,之后会有详细分析,帮助你理解每一个参数。等你理解后,这个小章节就是你的工具书啦~~ 以下参数以及默认值基于 OpenJDK 17
7.1. TLABStats(已过期)
从 Java 12 开始已过期,目前已经没有相关的逻辑了。之前是用于 TLAB 统计数据从而更好地伸缩 TLAB 但是性能消耗相对较大,但是现在主要通过 EMA 计算了。
7.2. UseTLAB
说明:是否启用 TLAB,默认是启用的。
默认:true
举例:如果想关闭:-XX:-UseTLAB
7.3. ZeroTLAB
说明:是否将新创建的 TLAB 内的所有字节归零。我们创建一个类的时候,类的 field 是有默认值的,例如 boolean 是 false,int 是 0 等等,实现的方式就是对分配好的内存空间赋 0。设置 ZeroTLAB 为 true 代表在 TLAB 申请好的时候就赋 0,否则会在分配对象并初始化的时候赋 0.讲道理,由于 TLAB 分配的时候会涉及到 Allocation Prefetch 优化 CPU 缓存,在 TLAB 分配好之后立刻更新赋 0 对于 CPU 缓存应该是更友好的,并且,如果 TLAB 没有用满,填充的 dummy object 其实依然是 0 数组,相当于大部分不用改。这么看来,开启应该更好。但是ZeroTLAB 默认还是不开启的。
默认:false
举例:-XX:+ZeroTLAB
7.4. ResizeTLAB
说明:TLAB 是否是可变的,默认为是,也就是会根据线程历史分配数据相关 EMA 计算出每次期望 TLAB 大小并以这个大小为准申请 TLAB。
默认:true
举例:如果想关闭:-XX:-ResizeTLAB
7.5. TLABSize
说明:初始 TLAB 大小。单位是字节
默认:0, 0 就是不主动设置 TLAB 初始大小,而是通过 JVM 自己计算每一个线程的初始大小
举例:-XX:TLABSize=65536
7.6. MinTLABSize
说明:最小 TLAB 大小。单位是字节
默认:2048
举例:-XX:TLABSize=4096
7.7. TLABAllocationWeight
说明: TLAB 初始大小计算和线程数量有关,但是线程是动态创建销毁的。所以需要基于历史线程个数推测接下来的线程个数来计算 TLAB 大小。一般 JVM 内像这种预测函数都采用了 EMA 。这个参数就是 图06 中的最小权重,权重越高,最近的数据占比影响越大。TLAB 重新计算大小是根据分配比例,分配比例也是采用了 EMA 算法,最小权重也是 TLABAllocationWeight
默认:35
举例:-XX:TLABAllocationWeight=70
7.8. TLABWasteTargetPercent
说明:TLAB 的大小计算涉及到了 Eden 区的大小以及可以浪费的比率。TLAB 浪费指的是上面提到的重新申请新的 TLAB 的时候老的 TLAB 没有分配的空间。这个参数其实就是 TLAB 浪费占用 Eden 的百分比,这个参数的作用会在接下来的原理说明内详细说明
默认:1
举例:-XX:TLABWasteTargetPercent=10
7.9. TLABRefillWasteFraction
说明: 初始最大浪费空间限制计算参数,初始最大浪费空间限制 = 当前期望 TLAB 大小 / TLABRefillWasteFraction
默认:64
举例:-XX:TLABRefillWasteFraction=32
7.10. TLABWasteIncrement
说明: 最大浪费空间限制并不是不变的,在发生 TLAB 缓慢分配的时候(也就是当前 TLAB 空间不足以分配的时候),会增加最大浪费空间限制。这个参数就是 TLAB 缓慢分配时允许的 TLAB 浪费增量。单位不是字节,而是 MarkWord 个数,也就是 Java 堆的内存最小单元,64 位虚拟机的情况下,MarkWord 大小为 3 字节。
默认:4
举例:-XX:TLABWasteIncrement=4
java ema算法_全网最硬核 JVM TLAB 分析 3. JVM EMA期望算法与TLAB相关JVM启动参数相关推荐
- 全网最硬核 JVM TLAB 分析 3. JVM EMA期望算法与TLAB相关JVM启动参数
今天,又是干货满满的一天.这是全网最硬核 JVM 系列的开篇,首先从 TLAB 开始.由于文章很长,每个人阅读习惯不同,所以特此拆成单篇版和多篇版 全网最硬核 JVM TLAB 分析(单篇版不包含额外 ...
- 全网最硬核 Java 新内存模型解析与实验 - 3. 硬核理解内存屏障(CPU+编译器)
个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...
- 全网最硬核 Java 新内存模型解析与实验 - 2. 原子访问与字分裂
个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...
- 全网最硬核 Java 新内存模型解析与实验 - 1. 什么是 Java 内存模型
个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...
- 全网最硬核 Java 新内存模型解析与实验 - 4. Java 新内存访问方式与实验
个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...
- 全网最硬核 JVM TLAB 分析 6. TLAB 相关热门QA汇总
今天,又是干货满满的一天.这是全网最硬核 JVM 系列的开篇,首先从 TLAB 开始.由于文章很长,每个人阅读习惯不同,所以特此拆成单篇版和多篇版 全网最硬核 JVM TLAB 分析(单篇版不包含额外 ...
- 全网最硬核 JVM TLAB 分析(额外加菜) 8. 通过 JFR 监控 TLAB
今天,又是干货满满的一天.这是全网最硬核 JVM 系列的开篇,首先从 TLAB 开始.由于文章很长,每个人阅读习惯不同,所以特此拆成单篇版和多篇版 全网最硬核 JVM TLAB 分析(单篇版不包含额外 ...
- 全网最硬核 JVM TLAB 分析(单篇版不包含额外加菜)
今天,又是干货满满的一天.这是全网最硬核 JVM 系列的开篇,首先从 TLAB 开始.由于文章很长,每个人阅读习惯不同,所以特此拆成单篇版和多篇版 全网最硬核 JVM TLAB 分析(单篇版不包含额外 ...
- 全网最硬核 JVM TLAB 分析 5. TLAB 源代码全解析
今天,又是干货满满的一天.这是全网最硬核 JVM 系列的开篇,首先从 TLAB 开始.由于文章很长,每个人阅读习惯不同,所以特此拆成单篇版和多篇版 全网最硬核 JVM TLAB 分析(单篇版不包含额外 ...
最新文章
- 解决No module named 'sklearn.cross_validation'
- MyBatis SQL语句操作Mysql
- 女朋友来大姨妈怎么办?
- 平安 开源 数据库 实践_刻意的实践-成为开源
- CV Code | 计算机视觉开源周报 20190701期
- 【CCCC】L3-004 肿瘤诊断 (30分),三维BFS
- django drf 改变retrive的pk查询字段
- linux innode节点读取,混沌工程之注入磁盘innode耗尽
- Java三大框架SSH简介
- 基于php的大学学生宿舍网上报修管理系统
- 使用httpclient调用url出现错误Illegal character in scheme name at index 0解决方案
- 2018计算机专硕学硕,2018考生快上车!专硕VS学硕,究竟怎么选?
- 阿里云物联网平台测试知识点梳理
- ADAS——高级驾驶辅助系统介绍
- Android 蓝色光滤波器(护眼神器) 反编译
- Flask入门教程—超详细
- 阿尔茨海默病与正常衰老中的脑萎缩研究进展
- 微信 进入公众号获取地理位置
- 用sqlcipher对已有的SQLite数据库加密
- hbuilder边框代码是什么_HBuilderX自定义UI主题界面风格
热门文章
- NIN网络-Network In Network
- 火山小视频怎么搬运 | 快手伪原创教程
- 基于javaweb的超市进销存管理系统(java+ssm+jsp+bootstrap+jquery+mysql)
- babylonjs 分部加载模型_17 Babylonjs入门进阶 使用场景加载器加载glTF,OBJ,STL模型...
- c语言+结构体指针初始化,c语言结构体指针初始化===
- 白色简洁大方公司企业网站源码 WordPress主题2款
- 《如何拍出清晰的照片》
- uml通信图画法_UML通信图参考.ppt
- el-submenu中.el-submenu__title选中后背景色不变
- 细粒度图像分类模型(含实战代码)