什么是Java';s-XX:+;UseMembar参数

什么是Java';s-XX:+;UseMembar参数,java,concurrency,jvm,jvm-arguments,Java,Concurrency,Jvm,Jvm Arguments,我在各种地方(论坛等)都能看到这个参数,而它的常见答案有助于高度并发的服务器。尽管如此,我还是找不到sun的官方文档来解释它的功能。另外,它是在Java6中添加的还是存在于Java5中 (顺便说一句,许多hotspot VM参数的最佳位置是) 更新:Java 5不会使用此参数启动。为了优化性能,JVM在代码中使用“伪内存屏障”在跨多个处理器同步时充当围栏指令。可以恢复为“真实”内存屏障指令,但这可能会对性能产生明显(且不好)影响 使用-XX:+UseMembar会导致VM恢复为真正的内存屏障指令

我在各种地方(论坛等)都能看到这个参数,而它的常见答案有助于高度并发的服务器。尽管如此,我还是找不到sun的官方文档来解释它的功能。另外,它是在Java6中添加的还是存在于Java5中

(顺便说一句,许多hotspot VM参数的最佳位置是)


更新:Java 5不会使用此参数启动。

为了优化性能,JVM在代码中使用“伪内存屏障”在跨多个处理器同步时充当围栏指令。可以恢复为“真实”内存屏障指令,但这可能会对性能产生明显(且不好)影响

使用
-XX:+UseMembar
会导致VM恢复为真正的内存屏障指令。这个参数原本打算作为新的伪屏障逻辑的验证机制暂时存在,但结果证明,新的伪内存屏障代码引入了一些同步问题。我相信这些问题现在已经解决了,但在解决这些问题之前,可以接受的解决方法是使用恢复的旗帜

这个bug是在1.5中引入的,我相信这个标志存在于1.5和1.6中

我从各种邮件列表和JVM bug中搜索到了这一点:


    • 我不同意巴特基奇的回答。本页
      表示此标志导致发出内存障碍,然后线程更改其状态(例如,从RUNNABLE到WAITING或BLOCKED)。

      Butterchick仅解释了故事的一半,我想对kmatveev的回答补充更多细节。是的,该选项用于线程状态更改,并且(伪)内存屏障用于确保更改从其他线程(尤其是VM线程)可见。OpenJDK6中使用的线程状态如下:

      //  _thread_new         : Just started, but not executed init. code yet (most likely still in OS init code)
      //  _thread_in_native   : In native code. This is a safepoint region, since all oops will be in jobject handles
      //  _thread_in_vm       : Executing in the vm
      //  _thread_in_Java     : Executing either interpreted or compiled Java code (or could be in a stub)
      ...
       _thread_blocked           = 10, // blocked in vm   
      
      如果没有UseMembar选项,在Linux中,Hotspot使用内存序列化页而不是内存屏障指令。每当发生线程状态转换时,线程都会使用易失性指针写入内存序列化页中的内存地址。当VM线程需要查看所有线程的最新状态时,VM会将内存序列化页的保护位更改为只读,然后将其恢复为读/写以序列化状态更改。下页将介绍更详细的机制:


      UseMembar决定是否严格使用membar指令,强制所有内存操作在继续之前完成

      它基本上阻止了处理器延迟的内存处理优化与处理代码的混乱

      这通常会减慢速度,在现代虚拟机上,对于绝大多数代码来说,这是不必要的

      有时您会遇到一些问题,代码应该是线程安全的,但不是因为没有使用membar指令。在这些情况下,您可以启用此选项以使此类代码正常工作,而无需切换到单线程或干扰代码的顺序来防止问题

      JVM通常擅长于检测将导致问题的代码,或者插入membar,或者执行JIT代码重新排列优化,以提供完成内存操作的时间。事实上,在我对这个主题的web搜索中,我只找到了一个bug的例子,它在最新版本的Oracle和hotspot JVM的OpenJRE版本中都得到了修复


      需要注意的是,对于ARM体系结构,此选项仍然默认为on,因为尚未应用替代优化(称为psuedo membar优化),因此,在没有membar指令的情况下,它可能会出现非常多的错误。

      BTW:-XX选项不受官方支持,可以在不通知的情况下从将来的版本中删除。@Rastislav true,但在许多情况下,您需要使用它们…另请参见:在有此错误的较新CPU和VM上,您可能会有非常奇怪的同步问题(在6u18中修复)它基本上改变了任何线程状态改变行为。因此,这适用于各种各样的情况。Butterchick过于狭窄,是membar不太常见、侵入性较小的用途之一。最具侵入性的是在序列化线程时,以及在以任何其他方式更改线程状态以立即执行时,而不是在跳转CPU时(这是在更改线程状态,但不会侵入性地发出membar)