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

  • 全网最硬核 JVM TLAB 分析(单篇版不包含额外加菜)
  • 全网最硬核 JVM TLAB 分析 1. 内存分配思想引入
  • 全网最硬核 JVM TLAB 分析 2. TLAB生命周期与带来的问题思考
  • 全网最硬核 JVM TLAB 分析 3. JVM EMA期望算法与TLAB相关JVM启动参数
  • 全网最硬核 JVM TLAB 分析 4. TLAB 基本流程全分析
  • 全网最硬核 JVM TLAB 分析 5. TLAB 源代码全解析
  • 全网最硬核 JVM TLAB 分析 6. TLAB 相关热门Q&A汇总
  • 全网最硬核 JVM TLAB 分析(额外加菜) 7. TLAB 相关 JVM 日志解析
  • 全网最硬核 JVM TLAB 分析(额外加菜) 8. 通过 JFR 监控 TLAB

6. JVM 中的期望计算 EMA

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

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

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

这块对应的源代码:[这里是代码001] 的 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

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

  1. java ema算法_全网最硬核 JVM TLAB 分析 3. JVM EMA期望算法与TLAB相关JVM启动参数

    6. JVM 中的期望计算 EMA 在上面提到的 TLAB 大小设计的时候,我们经常提到期望.这个期望是根据历史数据计算得出的,也就是每次输入采样值,根据历史采样值得出最新的期望值.不仅 TLAB 用 ...

  2. 全网最硬核 JVM TLAB 分析 6. TLAB 相关热门QA汇总

    今天,又是干货满满的一天.这是全网最硬核 JVM 系列的开篇,首先从 TLAB 开始.由于文章很长,每个人阅读习惯不同,所以特此拆成单篇版和多篇版 全网最硬核 JVM TLAB 分析(单篇版不包含额外 ...

  3. 全网最硬核 JVM TLAB 分析(额外加菜) 8. 通过 JFR 监控 TLAB

    今天,又是干货满满的一天.这是全网最硬核 JVM 系列的开篇,首先从 TLAB 开始.由于文章很长,每个人阅读习惯不同,所以特此拆成单篇版和多篇版 全网最硬核 JVM TLAB 分析(单篇版不包含额外 ...

  4. 全网最硬核 JVM TLAB 分析(单篇版不包含额外加菜)

    今天,又是干货满满的一天.这是全网最硬核 JVM 系列的开篇,首先从 TLAB 开始.由于文章很长,每个人阅读习惯不同,所以特此拆成单篇版和多篇版 全网最硬核 JVM TLAB 分析(单篇版不包含额外 ...

  5. 全网最硬核 JVM TLAB 分析 1. 内存分配思想引入

    今天,又是干货满满的一天.这是全网最硬核 JVM 系列的开篇,首先从 TLAB 开始.由于文章很长,每个人阅读习惯不同,所以特此拆成单篇版和多篇版 全网最硬核 JVM TLAB 分析(单篇版不包含额外 ...

  6. 全网最硬核 JVM TLAB 分析 4. TLAB 基本流程全分析

    今天,又是干货满满的一天.这是全网最硬核 JVM 系列的开篇,首先从 TLAB 开始.由于文章很长,每个人阅读习惯不同,所以特此拆成单篇版和多篇版 全网最硬核 JVM TLAB 分析(单篇版不包含额外 ...

  7. 全网最硬核 JVM TLAB 分析 5. TLAB 源代码全解析

    今天,又是干货满满的一天.这是全网最硬核 JVM 系列的开篇,首先从 TLAB 开始.由于文章很长,每个人阅读习惯不同,所以特此拆成单篇版和多篇版 全网最硬核 JVM TLAB 分析(单篇版不包含额外 ...

  8. 全网最硬核 JVM TLAB 分析 2. TLAB生命周期与带来的问题思考

    今天,又是干货满满的一天.这是全网最硬核 JVM 系列的开篇,首先从 TLAB 开始.由于文章很长,每个人阅读习惯不同,所以特此拆成单篇版和多篇版 全网最硬核 JVM TLAB 分析(单篇版不包含额外 ...

  9. 全网最硬核 JVM TLAB 分析(额外加菜) 7. TLAB 相关 JVM 日志解析

    今天,又是干货满满的一天.这是全网最硬核 JVM 系列的开篇,首先从 TLAB 开始.由于文章很长,每个人阅读习惯不同,所以特此拆成单篇版和多篇版 全网最硬核 JVM TLAB 分析(单篇版不包含额外 ...

最新文章

  1. 2017年9月9日普级组 买礼物的艰辛
  2. css display属性理解
  3. 初探Apache Impala
  4. python bs4模块_python爬虫之Beautifulsoup模块用法详解
  5. mysql批量提交的优化
  6. Python3中的可变与不可变类型
  7. [html] html中p标签内为何不能嵌套div标签?
  8. QT+OpenCV综合示例:图像混合(滑动条)
  9. python调用cmd命令释放端口_Python——cmd调用(os.system阻塞处理)(多条命令执行)...
  10. 第二百六十四节,Tornado框架-基于正则的动态路由映射分页数据获取计算
  11. 智能会议系统(2)---Android 2.3 APIs SIP-based VoIP
  12. PAT1070. 结绳
  13. python深度学习库keras——各类网络层
  14. python pytest setupclass_python – Pytest – 如何将参数传递给setup_class?
  15. Hive几种导出数据方式
  16. 指针的意义和linux的内存回收艺术
  17. Spring依赖注入的三种方式
  18. GJB150A-2009军用装备实验室环境试验标准目录
  19. 蓝桥杯真题:等差素数列
  20. CSS border-image(边框图片)

热门文章

  1. linux通过ip地址查主机名,如何根据linux根据ip地址查主机名
  2. 已知: 每个飞机只有一个油箱, 飞机之间可以相互加油(注意是相互,没有加油机) 一箱油可供一架飞机绕地球飞半圈, 问题:为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机?(所有飞机从
  3. 坚果J10S和当贝F5谁是LED投影仪榜首,看了这篇你全明白
  4. 什么是价值流图 (Value Stream)?示例汇总
  5. Shell脚本之——条件语句if详解
  6. macOS swift下使用贝塞尔曲线制作五子棋盘(1)
  7. iPhone手机被盗后,小偷是如何解锁密码的?看完长知识了
  8. 计算机网络技术项目教学版知识点,计算机网络基础教学
  9. 程序员的七种武器视频整理下载
  10. 《欢乐颂》-圈子不同,不必强融,自有剧本玩弄