有这篇文章就够了——JVM TLAB 分析(二)

开课吧开课吧锤锤2021-04-20 10:01

点赞
有用
分享分享

    Java编程语言是一种简单、面向对象、分布式、解释型、健壮安全、与系统无关、可移植、高性能、多线程和动态的语言。如今Java已经广泛应用于各个领域的编程开发。

Java

    3.JVM对象堆内存分配流程简述

Java

    我们这里不考虑栈上分配,这些会在JIT的章节详细分析,我们这里考虑的是无法栈上分配需要共享的对象。

    对于HotSpotJVM实现,所有的GC算法的实现都是一种对于堆内存的管理,也就是都实现了一种堆的抽象,它们都实现了接口CollectedHeap。当分配一个对象堆内存空间时,在CollectedHeap上首先都会检查是否启用了TLAB,如果启用了,则会尝试TLAB分配;如果当前线程的TLAB大小足够,那么从线程当前的TLAB中分配;如果不够,但是当前TLAB剩余空间小于最大浪费空间限制(这是一个动态的值,我们后面会详细分析),则从堆上(一般是Eden区)重新申请一个新的TLAB进行分配。否则,直接在TLAB外进行分配。TLAB外的分配策略,不同的GC算法不同。例如G1:

    如果是Humongous对象(对象在超过Region一半大小的时候),直接在Humongous区域分配(老年代的连续区域)。

    根据Mutator状况在当前分配下标的Region内分配

    4.TLAB的生命周期

Java

    TLAB是线程私有的,线程初始化的时候,会创建并初始化TLAB。同时,在GC扫描对象发生之后,线程第一次尝试分配对象的时候,也会创建并初始化TLAB。TLAB生命周期停止(TLAB声明周期停止不代表内存被回收,只是代表这个TLAB不再被这个线程私有管理)在:

    当前TLAB不够分配,并且剩余空间小于最大浪费空间限制,那么这个TLAB会被退回Eden,重新申请一个新的

    发生GC的时候,TLAB被回收。

    以上内容由开课吧老师干货满满张哈希提供,更多Java教程尽在开课吧广场Java教程频道。

有用
分享