👌JVM创建对象的时候,如何进行并发处理?
题目详细答案
在 JVM 中,为了支持高效的并发处理,特别是在创建对象时,JVM 采用了多种技术和优化策略。这些技术和策略旨在确保在多线程环境下对象创建的安全性和效率。
TLAB(Thread-Local Allocation Buffers)
TLAB 是 JVM 中的一种优化技术,用于减少线程间的内存分配冲突。每个线程都会被分配一个小的、私有的堆内存空间,称为 TLAB。对象首先尝试在 TLAB 中分配内存。如果 TLAB 中有足够的空间,内存分配可以在没有锁竞争的情况下完成,从而提高性能。
TLAB 工作流程
- 分配 TLAB:每个线程在创建时都会被分配一个 TLAB。
- 对象分配:当线程需要分配对象时,首先尝试在其 TLAB 中分配内存。
- TLAB 用尽:如果 TLAB 中没有足够的空间,线程会请求分配新的 TLAB。如果堆内存不足以分配新的 TLAB,线程将直接在全局堆中分配内存,这时可能需要进行同步操作。
锁机制
在某些情况下,特别是当 TLAB 用尽或者需要直接在全局堆中分配内存时,JVM 需要使用锁机制来确保线程安全。常见的锁机制包括:
轻量级锁(Lightweight Locking):通过使用 CAS(Compare-And-Swap)操作来实现快速锁定和解锁,适用于竞争不激烈的场景。
偏向锁(Biased Locking):当锁倾向于被同一个线程持有时,JVM 会减少锁的开销,适用于单线程访问的情况。
重量级锁(Heavyweight Locking):当锁竞争激烈时,JVM 会使用操作系统的互斥锁(如synchronized关键字),这会导致较高的开销。
并发垃圾回收器
并发垃圾回收器(如 G1、ZGC 和 Shenandoah)在进行垃圾回收时,尽量减少对应用线程的暂停时间。它们通过并发标记、并发清理和增量压缩等技术,确保在多线程环境下高效地管理堆内存。
内存屏障(Memory Barriers)
JVM 使用内存屏障来确保内存操作的顺序性和可见性。内存屏障是一种低级同步原语,用于防止编译器和 CPU 重新排序内存操作,从而确保在多线程环境下的内存一致性。
CAS(Compare-And-Swap)
CAS 是一种无锁的同步机制,广泛用于 JVM 的并发处理。它允许线程在不使用锁的情况下进行原子操作,从而提高并发性能。CAS 操作包括以下步骤:
- 读取内存位置的当前值。
- 比较当前值和预期值。
- 如果当前值等于预期值,则写入新值。
如果在写入过程中发现当前值已被其他线程修改,CAS 操作会失败,线程可以选择重试或采取其他措施。