JVM内存分配及申请过程

指针碰撞方式

代表GC回收器

空闲列表方式

代表GC回收器

Java虚拟机选择策略

现在虚拟机栈进行分配

此部分属于两部分的分配机制,当JVM创建线程Thread对象:

  1. 直接分配:局部变量、形式参数表。

  2. 优化分配:逃逸分析(栈上分配、标量替换等功能)。

新生区-Eden区的分配

🏆【JVM技术专区】「难点-核心-遗漏」TLAB内存分配+锁的碰撞(技术串烧)!-LMLPHP

TLAB内存的分配策略
总体内存分配流程策略

🏆【JVM技术专区】「难点-核心-遗漏」TLAB内存分配+锁的碰撞(技术串烧)!-LMLPHP

  1. jvm优先分配在eden区
  2. 当Eden空间足够时,内存申请结束。

JVM锁的膨胀执行流程机制

🏆【JVM技术专区】「难点-核心-遗漏」TLAB内存分配+锁的碰撞(技术串烧)!-LMLPHP

无锁节点/偏向锁阶段

无锁标记头

🏆【JVM技术专区】「难点-核心-遗漏」TLAB内存分配+锁的碰撞(技术串烧)!-LMLPHP

偏向锁标记头

🏆【JVM技术专区】「难点-核心-遗漏」TLAB内存分配+锁的碰撞(技术串烧)!-LMLPHP

  1. 会将相关的当前线程的线程ID赋值到相关的标记字段中。
  2. 为了提高性能以及栈空间可以获取相关的竞争数据,会将对象头的标记字段(Markword)拷贝到栈空间内部(Lock Record)锁记录。

轻量级锁阶段

竞争到锁的线程
未竞争到锁的线程

重量级锁阶段

未竞争到锁的线程
  1. 当超过自旋的线程一直处于自旋,且超过了自旋阈值之后,变会升级成为了重量级锁。

  2. 当更多的线程都处于争抢状态且属于自旋锁机制之后(出现了大量的轻量级锁之后),便会升级未重量级锁。

  3. 直到被唤醒重新镜像竞争锁资源信息。

竞争到锁的线程
  • 当锁标记因为发生变化,成为了重量级锁,所以,线程会同步自己的所记录,发现不一致,同步为重量级锁状态后,释放锁之后,进行唤醒阻塞的状态的线程。

  • 锁的状态暂时处于重量级锁状态。接下来会专门写一篇文章讲解一下锁降级哦,锁降级会较为复杂,而且场景完全不一样,对JVM要求也不一样。

当对象出现消亡了回收状态:

09-01 21:48