👌JVM创建对象的时候,如何进行并发处理?

👌JVM创建对象的时候,如何进行并发处理?

题目详细答案

在 JVM 中,为了支持高效的并发处理,特别是在创建对象时,JVM 采用了多种技术和优化策略。这些技术和策略旨在确保在多线程环境下对象创建的安全性和效率。

TLAB(Thread-Local Allocation Buffers)

TLAB 是 JVM 中的一种优化技术,用于减少线程间的内存分配冲突。每个线程都会被分配一个小的、私有的堆内存空间,称为 TLAB。对象首先尝试在 TLAB 中分配内存。如果 TLAB 中有足够的空间,内存分配可以在没有锁竞争的情况下完成,从而提高性能。

TLAB 工作流程

  1. 分配 TLAB:每个线程在创建时都会被分配一个 TLAB。
  2. 对象分配:当线程需要分配对象时,首先尝试在其 TLAB 中分配内存。
  3. 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 操作包括以下步骤:

  1. 读取内存位置的当前值
  2. 比较当前值和预期值
  3. 如果当前值等于预期值,则写入新值

如果在写入过程中发现当前值已被其他线程修改,CAS 操作会失败,线程可以选择重试或采取其他措施。

 wechat
天生我才必有用