前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【原创】JVM系列05 | TLAB上分配

【原创】JVM系列05 | TLAB上分配

作者头像
java进阶架构师
发布2020-06-04 10:23:10
5110
发布2020-06-04 10:23:10
举报
文章被收录于专栏:Java进阶架构师

本文是何适 JVM 修仙系列第 5 篇,文末有本系列文章汇总。

上一篇介绍的栈上分配,这篇介绍一个容易跟栈上分配混淆的 TLAB 上分配。

1. TLAB 上分配

Java 程序会极其频繁的创建对象并为对象分配内存空间,一般情况下对象是分配在堆上的,堆又是全局共享的,所以会存在这样一个问题:多个线程同时在堆上申请空间,而堆要同步处理,导致性能下降。

为了解决这个问题,Java 虚拟机提供了 TLAB 分配。TLAB 全称是 Thread Local Allocation Buffer,线程本地分配缓存,是一个线程私有的内存分配区域。

虚拟机在 eden 区为每一个线程分配一块线程专用的内存区域 TLAB 区域。这样多个线程同时在堆上申请空间时,可以直接在当前线程自己的 TLAB 区域分配对象,不必等待堆同步处理,提高了效率。

设置参数:-XX:+UseTLAB:打开 TLAB(默认是开启的)。

TLAB 空间的内存非常小,默认情况下仅占有整个 Eden 空间的 1%,当然可以通过选项-XX:TLABWasteTargetPercent 设置 TLAB 空间所占用 Eden 空间的百分比大小。

2. TLAB 上分配举例

如下代码,记录分配 100000000 个 byte 数组对象花费的时间:

代码语言:javascript
复制
public class TLABTest {
    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            byte[] b = new byte[2];
            b[0] = 1;
        }
        long endTime = System.currentTimeMillis();
        System.out.println(endTime - startTime);
    }
}

设置如下参数,开启 TLAB,花费时间 527ms

代码语言:javascript
复制
-XX:+UseTLAB -XX:-DoEscapeAnalysis -server

-XX:+UseTLAB:开启TLAB
-XX:-DoEscapeAnalysis:禁用逃逸分析,避免栈上分配的影响

设置如下参数,关闭 TLAB,花费时间 1166ms

代码语言:javascript
复制
-XX:-UseTLAB -XX:-DoEscapeAnalysis -server

-XX:-UseTLAB:关闭TLAB
-XX:-DoEscapeAnalysis:禁用逃逸分析,避免栈上分配的影响

3. 对象分配优先级

优先级排序:栈上分配 > TLAB 上分配 > eden 区 > 老年代

  1. 创建对象时,经过逃逸分析,确定对象是在栈上分配还是在堆上分配;
  2. 栈上分配失败或本身就是堆上分配的对象,先尝试 TLAB 上分配;
  3. TLAB 上分配失败,尝试新生代 eden 区分配;
  4. eden 区分配失败,分配至老年代。

4. 总结

栈上分配 VS TLAB 上分配

  • 栈上分配:将线程私有的不可能被其他线程访问的对象打散分配在栈上,而不是分配在堆上。
  • TLAB 上分配:虚拟机在 eden 区为每一个线程分配一块线程专用的内存区域 TLAB 区域。当多个线程同时在堆上申请空间时,可以直接在当前线程自己的 TLAB 区域分配对象,不必等待堆同步处理,提高了效率。
  • 栈上分配 优先于 TLAB 上分配

参考资料

  1. 《深入理解 Java 虚拟机(第 2 版) : JVM 高级特性与最佳实践》
  2. 《实战 Java 虚拟机 : JVM 故障诊断与性能优化》
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java进阶架构师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. TLAB 上分配
  • 2. TLAB 上分配举例
  • 3. 对象分配优先级
  • 4. 总结
    • 参考资料
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档