我一直在读关于使用标志-XX:+UseBiasedLocking
的偏置锁定如何提高非争用同步的性能的文章。我找不到它的作用以及它如何提高性能的参考资料。
有人能解释一下它到底是什么吗?或者可以给我指一些解释的链接/资源吗??
本质上,如果您的对象只被一个线程锁定,JVM可以进行优化并将该对象"偏置"到该线程,这样对对象的后续原子操作就不会产生同步成本。我想这通常是针对过于保守的代码,这种代码对对象执行锁,而从不将它们暴露给另一个线程。只有当另一个线程试图获得对象的锁时,实际的同步开销才会出现。
在Java 6中,它默认处于启用状态。
-XX: +使用偏置锁定启用一种用于提高非受控同步性能的技术。一个对象"偏向"于线程,该线程首先通过监视器字节码或同步方法调用获取其监视器;该线程执行的后续监视器相关操作在多处理器机器上相对较快。一些具有大量非受控同步的应用程序可以在启用该标志的情况下获得显著的加速;一些具有特定锁定模式的应用程序可能会出现速度减慢,尽管已经尝试将负面影响降至最低。
这不能回答您的问题吗?
http://www.oracle.com/technetwork/java/tuning-139912.html#section4.2.5
启用一种提高未受控制的性能的技术同步。一个物体被"偏向"于首先通过monitorrenter字节码或synchronized获取其监视器方法调用;由执行的后续监视器相关操作该线程在多处理器机器上相对较快。一些具有大量未控制的应用程序使用此标志,同步可能会获得显著的加速启用;一些具有特定锁定模式的应用程序可能会看到减速,尽管已经尝试将负面影响降至最低影响
尽管我想你会发现它在1.6中默认是打开的。使用PrintFlagsFinal diagnostic(打印标志最终诊断)选项查看有效标志是什么。如果您正在调查服务器应用程序,请确保指定-server,因为标志可能不同:
http://www.jroller.com/ethdsy/entry/print_all_jvm_flags
我自己一直在想有偏见的锁。
然而,在英特尔的nehalem处理器上,java的偏置锁似乎比普通锁慢,可能在nehalem之后的两代处理器上也是如此。看见http://mechanical-sympathy.blogspot.com/2011/11/java-lock-implementations.html在这里http://www.azulsystems.com/blog/cliff/2011-11-16-a-short-conversation-on-biased-locking
此处还有更多信息https://blogs.oracle.com/dave/entry/biased_locking_in_hotspot
我一直希望有一些相对便宜的方法来撤销对英特尔的偏见锁定,但我开始相信这是不可能的。我看到的关于如何做到这一点的文章依赖于以下两者之一:
- 使用操作系统停止线程
- 发送信号(在另一个线程中运行代码)
- 具有保证在另一个线程中经常运行的安全点,并等待执行一个安全点(java就是这样做的)
- 具有类似的安全点,即对返回的调用,而另一个线程将代码修改为断点
值得一提的是,默认情况下jdk15以后的将禁用偏置锁定
JEP 374:禁用并弃用偏置锁定
过去的业绩增长如今已不那么明显了。许多受益于偏置锁定的应用程序都是使用早期Java集合API的较旧的遗留应用程序,这些API在每次访问时都会同步(例如Hashtable和Vector)。较新的应用程序通常使用Java 1.2中为单线程场景引入的非同步集合(例如HashMap和ArrayList),或者Java 5中为多线程场景引入更高性能的并发数据结构。
进一步
偏置锁定在同步子系统中引入了许多复杂的代码,并且对其他HotSpot组件也具有侵入性。这种复杂性是理解代码各个部分的障碍,也是在同步子系统中进行重大设计更改的障碍。为此,我们希望禁用、弃用并最终删除对偏置锁定的支持。
你,再也没有System.identityHashCode(o)
魔法了;)
这里有两张纸:
https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/f4a5b21d-66fa-4885-92bf-c4e81c06d916/File/ccd39237cd4dc109d91786762fba41f0/qrl_oplocks_biasedlocking.pdf
https://www.oracle.com/technetwork/java/biasedlocking-oopsla2006-wp-149958.pdf
网页也:https://blogs.oracle.com/dave/biased-locking-in-hotspot
jvm热点源代码:
http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/87ee5ee27509/src/share/vm/oops/markOop.hpp