Monitor原理
发布日期:2025-04-14 18:12:31 浏览次数:7 分类:精选文章

本文共 1250 字,大约阅读时间需要 4 分钟。

Java Monitor和对象头深度解析

Java对象头概述

在Java虚拟机(JVM)中,Java对象和虚拟机内部对象都有一个共同的对象头格式。这个对象头包含了关于堆对象的布局、类型、GC状态、同步状态以及标识哈希码的基本信息。了解对象头的结构对于理解Java内存管理和优化非常重要。

Mark Word和Klass Word的组成

Java对象头由Mark Word和Klass Word两部分组成。

Mark Word(标记字)

Mark Word用于存储对象运行时的关键信息,包括:

  • 哈希码(HashCode):用于快速查找对象,通过System.identityHashCode()延迟计算,并将结果存储在Mark Word中。
  • GC分代年龄(Age):记录对象被垃圾回收器处理的次数,决定是否将对象转移到老年代。
  • 锁状态标志(Lock State):表示对象当前的锁状态。
  • 线程持有的锁(Biased Lock):在偏向锁模式下,存储持有锁的线程ID。
  • 偏向时间戳(Epoch):记录偏向锁的时间戳,用于CAS操作时判断对象是否偏向当前线程。
  • 轻量锁指针(Ptr to Lock Record):用于轻量锁状态下存储锁记录的指针。
  • 重量锁指针(Ptr to Heavyweight Monitor):用于重量锁状态下存储Monitor的指针。

Mark Word在32位JVM中占用32位,在64位JVM中占用64位。无论位数如何,Mark Word的组成内容基本一致。

Klass Word(类指针)

Klass Word用于指向Java类的元数据,包括类的版本、加载时间和其他与类相关的信息。

Monitor锁机制

Monitor(管程)是Java同步机制的核心,用于管理多线程访问共享资源的同步。每个Java对象都可以关联一个Monitor对象,当使用sync关键字对对象进行同步时,JVM会将对象头的Mark Word指向该Monitor。

Monitor的状态与行为

Monitor的初始状态下,Owner字段为null。当一个线程尝试获取锁时:

  • 如果当前线程已经持有锁,则设置Monitor的Owner为当前线程。
  • 如果其他线程试图获取锁,则将其加入EntryList,进入等待状态(BLOCK状态)。
  • 当当前线程释放锁后,JVM会唤醒EntryList中的线程,进入非公平的锁竞争。
  • 等待的线程会被转移到WaitSet中,进入WAITING状态。
  • Monitor的结构

    Monitor对象包含以下字段:

    • Owner:持有锁的线程ID。
    • WaitSet:存储处于等待状态的线程。
    • EntryList:存储等待获取锁的线程。
    • Heavyweight Monitor Header:在重量锁状态下指向Monitor的指针。

    参考文章

    通过理解Java对象头和Monitor锁机制,可以更好地优化Java程序的内存管理和多线程性能。

    上一篇:monkey入门_Monkey入门_琉璃
    下一篇:Monitorr 任意文件上传漏洞复现(CVE-2024-0713)

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2025年05月12日 17时52分06秒