请问什么时候对象分配会不在 TLAB 内分配

简介: 请问什么时候对象分配会不在 TLAB 内分配

Java 对象分配流程


微信图片_20220625123832.jpg


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

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

  • 如果是 Humongous 对象(对象在超过 Region 一半大小的时候),直接在 Humongous 区域分配(老年代的连续区域)。
  • 根据 Mutator 状况在当前分配下标的 Region 内分配


TLAB 慢分配与 TLAB 外分配


重新申请一个 TLAB 进行分配,是 TLAB 慢分配,不在 TLAB 分配被称为 TLAB 外分配。我们可以通过 JFR 来监控 TLAB 慢分配或者 TLAB 外分配事件。也就是jdk.ObjectAllocationOutsideTLABjdk.ObjectAllocationInNewTLAB这两个事件。

jdk.ObjectAllocationOutsideTLABjdk.ObjectAllocationInNewTLAB 这两个事件在default.jfc中( JFR 默认事件采集配置)是没有开启采集的:

<event name="jdk.ObjectAllocationInNewTLAB">
  <setting name="enabled">false</setting>
  <setting name="stackTrace">true</setting>
</event>
<event name="jdk.ObjectAllocationOutsideTLAB">
  <setting name="enabled">false</setting>
  <setting name="stackTrace">true</setting>
</event>

一般的,采集这两个事件,是需要连着堆栈一起采集,但是无法通过持续时间(因为这个事件没有持续时间这一概念)限制采集哪些,也就是只要开启就是全部采集,所以不建议长期开启这个采集。而是通过一些其他的监控项,按照需要,动态开启这个采集一段时间,之后关闭并 dump 出 JFR 文件用于分析。

相关文章
|
6月前
|
存储 程序员 C++
C++堆内存分配
C++堆内存分配
57 2
|
3月前
|
Java 开发者
UseConcMarkSweepGC 的情况下 PrintTenuringDistribution 和 PrintGCDetails 的对象空间占用不一致的问题
总之,`PrintTenuringDistribution`和 `PrintGCDetails`在使用 `-XX:+UseConcMarkSweepGC`时显示的不一致性,主要是由于CMS收集器的并发特性以及GC事件的动态性质所引起的。通过综合分析多种数据源和调整GC策略,可以更有效地理解和优化应用程序的GC性能。
47 3
|
Java
16-内存分配与回收策略-对象优先分配Eden+大对象进老年代
大多数情况下, 对象在新生代Eden区中分配。 当Eden区没有足够空间进行分配时, 虚拟机将发起一次Minor GC。HotSpot虚拟机提供了-XX: +PrintGCDetails这个收集器日志参数, 告诉虚拟机在发生垃圾收集行为时打印内存回收日志, 并且在进程退出的时候输出当前的内存各区域分配情况。 在实际的问题排查中, 收集器日志常会打印到文件后通过工具进行分析 。
115 0
16-内存分配与回收策略-对象优先分配Eden+大对象进老年代
|
存储 Oracle Java
JVM是如何分配管理内存的?
JVM是如何分配管理内存的?
117 0
|
存储 IDE 编译器
函数内部分配的buffer过大导致堆栈溢出
函数内部分配的buffer过大导致堆栈溢出
458 0
函数内部分配的buffer过大导致堆栈溢出
|
存储 安全 Java
Java虚拟机对象分配策略
Java虚拟机对象分配策略
|
存储 缓存 算法
【JVM深度解析】对象的分配策略栈上分配与TLAB
JVM是如何自动进行内存管理的呢?本文详细对象的分配策略,栈上分配与TLAB,相信相信大家看完已经掌握JVM是如何管理,本文适合点赞+收藏。
【JVM深度解析】对象的分配策略栈上分配与TLAB
|
缓存 算法 Java
JVM05_堆的概述、内存结构、复制算法、Minor|Major|Full GC、私有区域TLAB、对象分配、参数总结、逃逸分析、栈上分配、锁消除、标量替换(二)
⑤. 复制算法 ⑥. Minor GC | Major GC | Full GC ⑦. 针对不同年龄阶段的对象分配原则 ⑧. TLAB(Thread Local Allocation Buffer)
135 0
JVM05_堆的概述、内存结构、复制算法、Minor|Major|Full GC、私有区域TLAB、对象分配、参数总结、逃逸分析、栈上分配、锁消除、标量替换(二)
|
存储 算法 Java
JVM05_堆的概述、内存结构、复制算法、Minor|Major|Full GC、私有区域TLAB、对象分配、参数总结、逃逸分析、栈上分配、锁消除、标量替换(一)
①. 堆的概述(共享|垃圾回收) ②. 堆的内存结构 ③. 堆空间大小的设置 -Xms -Xmx ④. 新生代与老年代参数设置 NewRation SurvivorRatio
141 0
JVM05_堆的概述、内存结构、复制算法、Minor|Major|Full GC、私有区域TLAB、对象分配、参数总结、逃逸分析、栈上分配、锁消除、标量替换(一)