您的位置:首页 > 职场人生

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

2020-05-31 08:24 155 查看

精选30+云产品,助力企业轻松上云!>>>

  20大进阶架构专题每日送达

  

  

  本文是何适 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 数组对象花费的时间:   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

  -XX:+UseTLAB -XX:-DoEscapeAnalysis -server

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

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

  -XX:-UseTLAB -XX:-DoEscapeAnalysis -server

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

3. 对象分配优先级

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

  创建对象时,经过逃逸分析,确定对象是在栈上分配还是在堆上分配;

  栈上分配失败或本身就是堆上分配的对象,先尝试 TLAB 上分配;

  TLAB 上分配失败,尝试新生代 eden 区分配;

  eden 区分配失败,分配至老年代。

  
4. 总结

  栈上分配 VS TLAB 上分配

  栈上分配:将线程私有的不可能被其他线程访问的对象打散分配在栈上,而不是分配在堆上。

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

  栈上分配 优先于 TLAB 上分配

  参考资料

  《深入理解 Java 虚拟机(第 2 版) : JVM 高级特性与最佳实践》

  《实战 Java 虚拟机 : JVM 故障诊断与性能优化》

  JVM 系列文章汇总

  之前,给大家发过三份Java面试宝典,这次新增了一份,目前总共是四份面试宝典,相信在跳槽前一个月按照面试宝典准备准备,基本没大问题。

  《java面试宝典5.0》(初中级)

  《350道Java面试题:整理自100+公司》(中高级)

  《资深java面试宝典-视频版》(资深)

  《Java[BAT]面试必备》(资深)

  分别适用于初中级,中高级资深级工程师的面试复习。

  内容包含java基础、javaweb、mysql性能优化、JVM、锁、百万并发、消息队列,高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper、数据结构、限流熔断降级等等。

  获取方式:点“在看”,V信关注上述单号并回复【面试】即可领取,更多精彩陆续奉上。

  看到这里,证明有所收获

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试