11 对象创建
类加载
空间分配
指针碰撞
空闲列表
TLAB 线程本地缓冲区
TLAB 是 Thread Local Allocation Buffer 的缩写,也称为线程本地分配缓冲区。我们以垃圾回收器采用 CMS 为例,这种情况下,所有的对象都是在新生代 Eden 区分配的。因为 Eden 区也是全局共享的,当同一时间有多个线程同时向 Eden 区申请空间分配的时候,就必然会引发同步问题,从而导致内存分配效率降低。
为此 JVM 引入了 TLAB 机制,也就是以线程为单位,为每个线程分配一块区域以减少同步竞争,从而提升对象分配的效率
当然即使使用了 TLAB,也不会无限地给一个线程分配空间,因为在实际的生产环境中堆空间是非常宝贵的资源,所以 TLAB 分配的空间一般不会很大。我们可以通过 -XX:TLABWasteTargetPercent 来设置 TLAB 占用的空间大小。因为 TLAB 空间是有限的,所以很可能会出现分配的对象大小超过 TLAB 空间的情况。这种情况下有两种解决方案,第一种就是绕过 TLAB,直接在堆上分配,第二种就是废弃掉当前的 TLAB,创建一个新的 TLAB 来满足新分配的对象的空间要求。
对象创建两段论
对象创建快捷流水线
这条全新的流水线主要由四个节点构成
12 JVM对象创建模式和最佳实践
JVM创建对象流程
对象在 JVM 中存在的形态
Book 类对象存储在 JVM 里,总共由 3 个部分组成,分别是对象头、实例数据和对齐填充
我们可以用 -XX:+UseTLAB 来启用 TLAB,它在 JDK8 中是默认开启的。开启 TLAB 后,每个线程在创建对象时都会在自己的 TLAB 中进行,从而避免了不同线程间的内存分配竞争,提升了系统性能。反之,如果我们没有开启 TLAB,那么这 10 个线程都将在共有的 Eden 区进行内存分配,会存在较大的竞争和同步开销,系统性能将大大降低。
13 对象回收(上):定位待回收的对象
什么是 GC
GC 是 Garbage Collection 的缩写,中文叫做垃圾回收。它是一种自动化的内存管理机制,能够识别和回收不再使用的内存空间。在 Java 里,JVM 负责 GC。通过这种方式,Java 程序员无需手动进行内存的分配和回收,从而降低了内存泄漏的风险,提高了开发效率。