咱们这里不考虑栈上分配,这些会在 JIT 的章节详细分析,咱们这里考虑的是没法栈上分配须要共享的对象。git
对于 HotSpot JVM 实现,全部的 GC 算法的实现都是一种对于堆内存的管理,也就是都实现了一种堆的抽象,它们都实现了接口 CollectedHeap。当分配一个对象堆内存空间时,在 CollectedHeap 上首先都会检查是否启用了 TLAB,若是启用了,则会尝试 TLAB 分配;若是当前线程的 TLAB 大小足够,那么从线程当前的 TLAB 中分配;若是不够,可是当前 TLAB 剩余空间小于最大浪费空间限制,则从堆上(通常是 Eden 区) 从新申请一个新的 TLAB 进行分配。不然,直接在 TLAB 外进行分配。TLAB 外的分配策略,不一样的 GC 算法不一样。例如G1:github
从新申请一个 TLAB 进行分配,是 TLAB 慢分配,不在 TLAB 分配被称为 TLAB 外分配。咱们能够经过 JFR 来监控 TLAB 慢分配或者 TLAB 外分配事件。也就是jdk.ObjectAllocationOutsideTLAB
与jdk.ObjectAllocationInNewTLAB
这两个事件。算法
jdk.ObjectAllocationOutsideTLAB
和 jdk.ObjectAllocationInNewTLAB
这两个事件在default.jfc
中( JFR 默认事件采集配置)是没有开启采集的:ide
<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 文件用于分析。线程
每日一刷,轻松提高技术,斩获各类offer:code