堆—TLAB为对象分配内存

堆—逃逸分析与代码优化

为什么要有 TLAB?

  1. 堆区是线程共享区域,任何线程都可以访问到堆区中的共享数据;
  2. 由于对象实例的创建在JVM中非常频繁,因此在并发环境下从堆区中划分内存空间是线程不安全的;
  3. 为避免多个线程操作同一地址,需要使用加锁等机制,进而影响分配速度。

什么是 TLAB?

TLAB(Thread Local Allocation Buffer):

  1. 从内存模型而不是垃圾收集的角度,对Eden区域继续进行划分,JVM为每个线程分配了一个私有缓存区域(栈中提到),它包含在Eden空间内;
  2. 多线程同时分配内存时,使用TLAB可以避免一系列的非线程安全问题,同时还能够提升内存分配的吞吐量,因此可以将这种内存分配方式称之为快速分配策略;
  3. 目前所知,所有OpenJDK衍生出来的JVM都提供了TLAB的设计。
  4. 每个线程都有一个TLAB空间;
  5. 当一个线程的TLAB存满时,可以使用公共区域(蓝色)的。

说明

  1. 尽管不是所有的对象实例都能够在TLAB中成功分配内存,但JVM确实是将TLAB作为内存分配的首选。

  2. 在程序中,开发人员可以通过选项 -XX:UseTLAB 设置是否开启TLAB空间。

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

  4. 一旦对象在TLAB空间分配内存失败时,JVM就会尝试着通过使用加锁机制确保数据操作的原子性,从而直接在Eden空间中分配内存。

    注: 哪个线程要分配内存,就在哪个线程的本地缓冲区中分配,只有本地缓冲区用完 了,分配新的缓存区时才需要同步锁定—《深入理解JVM》第三版 。

代码演示

代码示例:

//-XX:UseTLAB参数是否开启的情况:默认情况是开启的
public class TLABArgsTest {public static void main(String[] args) {System.out.println("我只是来打个酱油~");try {Thread.sleep(1000000);} catch (InterruptedException e) {e.printStackTrace();}}
}
  • 终端输入 jsp,查看TLABArgsTest进程id;
  • jinfo -flag UseTLAB 36732(进程id),输出-XX:+UseTLAB,证明TLAB默认是开启的.

TLAB 分配过程

小结堆空间的参数设置

 -XX:PrintFlagsInitial: 查看所有参数的默认初始值-XX:PrintFlagsFinal:查看所有的参数的最终值(可能会存在修改,不再是初始值)具体查看某个参数的指令:- jps:查看当前运行中的进程;- jinfo -flag SurvivorRatio 进程id: 查看新生代中Eden和S0/S1空间的比例.-Xms: 初始堆空间内存(默认为物理内存的1/64)-Xmx: 最大堆空间内存(默认为物理内存的1/4)-Xmn: 设置新生代大小(初始值及最大值)-XX:NewRatio: 配置新生代与老年代在堆结构的占比-XX:SurvivorRatio:设置新生代中Eden和S0/S1空间的比例-XX:MaxTenuringThreshold:设置新生代垃圾的最大年龄(默认15)-XX:+PrintGCDetails:输出详细的GC处理日志打印gc简要信息:① -XX:+PrintGC   ② -verbose:gc-XX:HandlePromotionFailure:是否设置空间分配担保

说明

在发生Minor Gc之前,虚拟机会检查老年代最大可用的连续空间是否大于新生代所有对象的总空间。

  • 如果大于,则此次Minor GC是安全的;
  • 如果小于,则虚拟机会查看-XX:HandlePromotionFailure设置值是否允许担保失败。如果HandlePromotionFailure=true,那么会继续检查老年代最大可用连续空间是否大于历次晋升到老年代的对象的平均大小。
    - 如果大于,则尝试进行一次Minor GC,但这次Minor GC依然是有风险的;
    - 如果小于,则改为进行一次Full GC。
    如果HandlePromotionFailure=false,则改为进行一次Full GC。

历史版本:

  1. 在JDK6 Update 24 之后,HandlePromotionFailure参数不会再影响到虚拟机的空间分配担保策略,观察openJDK中的源码变化,虽然源码中还定义了HandlePromotionFailure参数,但是在代码中已经不会再使用它。
  2. JDK6 Update 24 之后的规则变为只要老年代的连续空间大于新生代对象总大小或者历次晋升的平均大小就会进行Minor GC,否则将进行Full GC。即 HandlePromotionFailure=true.

JVM运行时数据区---堆(TLAB)相关推荐

  1. JVM运行时数据区---堆(堆内存)

    运行时数据区-堆 JVM 堆的对象分配过程 堆中TLAB为对象分配内存 堆-逃逸分析与代码优化 堆的核心概念 <Java虚拟机规范>中对Java堆的描述是:所有的对象实例以及数组都应当在运 ...

  2. JVM运行时数据区和各个区域的作用

    一.JVM主要分为5个核心区域(6个子区域),分别是: 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区 *运行时常量池(属于"方法区"的一部分) 二.各个区域作用和描 ...

  3. Java内存管理:Java内存区域 JVM运行时数据区

    Java内存管理:Java内存区域 JVM运行时数据区 在前面的一些文章了解到javac编译的大体过程.Class文件结构.以及JVM字节码指令. 下面我们详细了解Java内存区域:先说明JVM规范定 ...

  4. 一篇文章带你快速理解JVM运行时数据区 、程序计数器详解 (手画详图)值得收藏!!!

    受多种情况的影响,又开始看JVM 方面的知识. 1.Java 实在过于内卷,没法不往深了学. 2.面试题问的多,被迫学习. 3.纯粹的好奇. 很喜欢一句话:"八小时内谋生活,八小时外谋发展. ...

  5. JVM运行时数据区分析

    #1.概述 整个JVM构成⾥⾯,由三部分组成:类加载器机制.运⾏时数据区.执⾏引擎. #2.JVM运行时数据区的规范 我们来聊聊这个规范怎么理解,目前运行数据区共分为了方法区.堆.虚拟机栈.本地方法栈 ...

  6. Java -----JVM运行时数据区

    一.JVM体系结构 想要了解运行时数据区,先关注一下JVM的体系结构,知道数据区在JVM的整体位置和作用. 二.JVM运行时数据区 1.程序计数器 一块较小的内存空间,它是当前线程所执行的字节码的行号 ...

  7. 掌握JVM 运行时数据区,其实不是很难,加薪也是要技巧可言的!!!

    一.概念 Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分. 而内存模型(Java Memory Model,简称 JMM )是定义了线程 ...

  8. JVM运行时数据区概览

    在学习JVM之前我们需要明确的是,我们所学习的是JVM的一个规范,在实际中有很多不同种类的虚拟机来实现这一种规范.其次JVM运行时数据区和JMM的区别我们要搞清楚,不能将JMM理解为JVM运行是数据区 ...

  9. Java8 JVM运行时数据区概述 (极其详细长文)

    文章目录 运行时数据区概述 JVM中的线程说明 PC寄存器(PC Register) PC寄存器介绍 使用举例 问题:使用PC寄存器存储字节码指令地址有什么用?为什么使用PC寄存器存储? 问题:为什么 ...

最新文章

  1. 十项观察!药物开发中的AI现状
  2. 渐统江湖的项目原型生成工具 -- Maven Archetype
  3. Centos7手动安装OpenStack Mitaka版本--KeyStone安装
  4. Github大热论文 | U-GAT-IT:基于GAN的新型无监督图像转换
  5. 前端学习(2165):vuecli3创建项目和目录结构
  6. 《Python Cookbook 3rd》笔记(1.11):命名切片
  7. Docker(从入门到部署微服务集群)
  8. hdu5773The All-purpose Zero,1257最少拦截次数
  9. 实例讲解kubernetes网络通信
  10. 批处理文件进行音频格式转换
  11. 中国LVDT RVDT传感器市场现状研究分析与发展前景预测报告(2022)
  12. 在java中 数组是作为_2.在Java中,数组是作为____来处理的。
  13. php同时接受get post,php中form表单同时使用POST和GET传递参数说明
  14. 【云和恩墨】高能分布式架构 zData | 敏捷提速某保险公司核心系统全速运行
  15. 记录一下蚂蚁金服的电话面试
  16. Oracle 闪回技术详解
  17. python严格使用缩进来体现代码的逻辑从属关系_Python 全国考级二级
  18. UNIX OS 简史(转)
  19. 11.03 P73 模拟+堆+贪心
  20. 7-7 选民投票 STL

热门文章

  1. C语言按两个字节读写二进制文件,C语言 读写二进制文件(示例代码)
  2. c语言循环控制答案,C语言程序设计 实四 循环控制 答案 《西北民大 电气院》.doc...
  3. SylixOS移植时mk_time函数问题
  4. 如何阅读JAVA 字节码(一)
  5. 美团多渠道打包方案详解,速度快到白驹过隙
  6. Azkaban的Web Server源码探究系列7: ExecutorManager的初始化
  7. NO.80 禅道使用分享第九期:测试部门缺陷管理的新需求
  8. 异地多活实践与设计思考点归纳
  9. 重要通知:招募200程序员,免费培训金融知识,不限年龄,有意者进!
  10. 金三银四,写个漂亮的技术简历