全网最硬核 JVM TLAB 分析 3. JVM EMA指望算法与TLAB相关JVM启动参数

今天,又是干货满满的一天。这是全网最硬核 JVM 系列的开篇,首先从 TLAB 开始。因为文章很长,每一个人阅读习惯不一样,因此特此拆成单篇版和多篇版git

6. JVM 中的指望计算 EMA

在上面提到的 TLAB 大小设计的时候,咱们常常提到指望。这个指望是根据历史数据计算得出的,也就是每次输入采样值,根据历史采样值得出最新的指望值。不只 TLAB 用到了这种指望计算,GC 和 JIT 等等 JVM 机制中都用到了。这里咱们来看一种 TLAB 中常常用到的 EMA(Exponential Moving Average 指数平均数) 算法:github

image

EMA 算法的核心在于设置合适的最小权重,咱们假设一个场景:首先采样100个 100(算法中的前 100 个是为了排除不稳定的干扰,咱们这里直接忽略前 100 个采样),以后采样 50 个 2,最后采样 50 个 200,对于不一样的最小权重,来看一下变化曲线。算法

image

能够看出,最小权重越大,变化得越快,受历史数据影响越小。根据应用设置合适的最小权重,可让你的指望更加理想。数组

这块对应的源代码:gcUtil.hppAdaptiveWeightedAverage 类。缓存

7. TLAB 相关的 JVM 参数

这里仅仅是列出来,并附上简介,看不懂不要紧,以后会有详细分析,帮助你理解每个参数。等你理解后,这个小章节就是你的工具书啦~~ 如下参数以及默认值基于 OpenJDK 17函数

7.1. TLABStats(已过时)

从 Java 12 开始已过时,目前已经没有相关的逻辑了。以前是用于 TLAB 统计数据从而更好地伸缩 TLAB 可是性能消耗相对较大,可是如今主要经过 EMA 计算了。工具

7.2. UseTLAB

说明:是否启用 TLAB,默认是启用的。性能

默认:truefetch

举例:若是想关闭:-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

相关文章
相关标签/搜索