java - Java 中存储的对象的条目数在哪里

标签 java multithreading jvm synchronized monitor

据我所知,每个Java对象都可以用作监视器。如果与对象关联的条目计数为零,则线程可以获得锁。如果同一线程获取锁,则条目计数通过“monitorenter”操作码递增,并在同一线程在“monitorexit”期间释放代码时递减。该条目计数存储在哪里?它是如何链接到Java对象的?创建对象时会分配它吗?

最佳答案

每个 JVM 可能有不同的内在锁实现。对于HotSpot JVM,它根本不计算锁条目,而是使用monitorenter/monitorexit字节码在方法的堆栈帧中保留插槽。

HotSpot JVM 有两种 Java 监视器机制:

  1. 偏向锁。通过将线程 ID 放入对象头中,对象“偏向”给定线程。那么给定线程中的锁定和解锁几乎是无操作:JVM 只需验证偏向锁标记是否仍在对象头中。
  2. 常规递归锁。如果方法具有synchronized block (即monitorenter/monitorexit)字节码,则堆栈上保留一个位置来记录锁定信息:一个对象及其移位的 header (即锁定之前的 header 值)。如果对象被递归锁定,则移位的 header 包含零,因此虚拟机知道它不应在 monitorexit 上更新对象 header 。

更多详细信息请参见HotSpot sources .

关于java - Java 中存储的对象的条目数在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43152226/

相关文章:

eclipse - 增加 Eclipse 的 JVM 最大堆大小

java - 对象是从 Java 中的引用数组中预取的吗?

c++ - 读/写锁

java - 比较 Java 和 .NET 上的可扩展 Web 应用程序架构

java - : "Events are received on the UI thread and read on the main loop thread"?是什么意思

java - 在这种情况下如何实现线程?

java - "__JVM_DefineClass__"作为类加载器位置意味着什么?

java - 如何从 JVM 分析和监控 gc.log 垃圾收集器日志文件

java - SDN 保存节点并更新附加关系的属性

java - 使用客户端 IP 的 session 状态