【问题标题】:Is there a relation between object size and locking performancein Java?Java中的对象大小和锁定性能之间是否存在关系?
【发布时间】:2012-01-29 23:50:51
【问题描述】:

在著名的 Java 并发实践第 2.4 节中,它说内部锁定方法与显式锁定相比是一个糟糕的设计决策,因为它令人困惑,并且“......它迫使 JVM 实现者在对象大小和锁定性能。” 有人可以解释一下对象大小如何影响锁定性能吗?

【问题讨论】:

  • synchronized 类型锁的大小应该没有关系(根据我实现这一点的经验),而且,从对 Java 5 锁定方案的简要回顾来看,我不会随便看看那里是怎么回事也可能是那里的依赖。当然,实现单独的Lock 对象确实需要更多的存储空间,但这应该是固定开销。
  • @HotLicks 这让我很吃惊,size shudnt 有任何额外的开销,谢谢!

标签: java performance concurrency size


【解决方案1】:

因为每个对象都可以被锁定,这意味着每个对象都必须有足够的空间来存储我们在锁定时需要的所有信息。

这很不吸引人,因为绝大多数对象永远不会被锁定,所以我们浪费了大量空间。所以在实践中,Hotspot 通过使用 2bits 来记录对象的状态并根据这两个位重用对象头的其余部分来解决这个问题。

然后是所有有偏见/无偏见的锁定内容......好吧,您可以开始阅读它here。热点文档不是我所说的广泛文档,但锁定和对象头文件比其他大多数文档更好地表示。但有疑问:阅读源代码。

PS:我们对每个对象的本机哈希码也有类似的问题。如果您的 GC 随机播放对象,“只使用内存地址”就不是很好了。 (但与锁定相反,没有真正的选择 - 如果我们想要这个功能)

【讨论】:

  • 感谢您提供的信息,基本上是关于所有原始同步的信息,无论用于锁定的特定对象的大小如何
  • 您对这些陈述有什么具体要求吗? “很多”空间?锁定时需要哪些信息?
  • @Toby 至少是 TID 和递归计数器。有关详细信息,您必须查看热点源中的重锁类。考虑到这被添加到每个对象中,即使 1-2 个单词也是“大量空间”。
  • @Toby 实际上查了一下,ObjectMonitor 对象的大小大约有 16 个变量,都是 int 或 intptrs。为什么我们需要所有这些信息?好吧,你必须阅读代码 - 它是相当复杂的类。
【解决方案2】:

最有效的锁使用原生字长,例如32 位字段。但是,您不想为每个对象添加 4 个字节,因此使用 AFAIK 1 位,但是设置此位比设置字长更昂贵。

【讨论】:

  • 嗯,即使我们使用单词大小的字段,我们也可以在没有 CAS 的情况下做到这一点吗?如果不是,它基本上只是读取 + 位改组 + CAS 与 CAS - 可能没那么糟糕,但仍然较慢。
  • @Voo 在我的经验中并没有那么糟糕,因为 synchronized 可以通过 JIT 进行优化,而 Lock 不是。
  • 我说的是同步实现。即使我们使用了一个字长的锁定标头,我们仍然需要一个 CAS 来主导位改组,所以那里没有太大区别。不过,我们可能正在互相交谈。
  • CAS 相当快,大约 5 ns。一个无竞争的同步可能是 20 ns 左右。
  • 当然,但我声称位移 + CAS(就像现在所做的那样)与字大小数组上的 CAS 之间的区别基本上一样快,所以这样做并没有真正的性能提升。
猜你喜欢
  • 2015-12-04
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
相关资源
最近更新 更多