我在各种地方(论坛等)都看到了这个参数。常见的答案是帮助高度并发的服务器。尽管如此,我还是找不到sun的官方文件来解释它的功能。另外,它是在Java 6中添加的还是在Java 5中存在的?
(顺便说一句,此页是许多热点VM参数的好地方)
更新: Java 5不使用此参数启动。
发布于 2009-07-13 16:03:16
为了优化性能,JVM在代码中使用“伪内存屏障”,在跨多个处理器进行同步时充当隔离指令。恢复到“真”内存屏障指令是可能的,但这可能会对性能产生明显的(和坏的)影响。
使用-XX:+UseMembar会使VM恢复到真正的内存屏障指令。这个参数最初是作为新伪屏障逻辑的验证机制暂时存在的,但结果表明新的伪内存屏障代码引入了一些同步问题。我相信这些问题现在是固定的,但在解决这些问题之前,可以接受的方法是使用恢复使用的旗帜。
bug是在1.5中引入的,我相信这个标志在1.5和1.6中存在。
我已经从各种邮件列表和JVM错误中获得了这一信息:
发布于 2011-06-15 19:08:40
蝴蝶鸡只解释了一半的故事,我想补充更多的细节,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将内存序列化页的保护位更改为只读,然后将其恢复为读/写以序列化状态更改。下页介绍了更详细的机制:
http://home.comcast.net/~pjbishop/Dave/Asymmetric-Dekker-Synchronization.txt
发布于 2010-01-18 14:04:34
我不同意蝴蝶鸡的回答。此页面http://www.md.pp.ru/~eu/jdk6options.html表示,此标志将导致发出内存屏障,然后线程更改其状态(例如,从可运行到等待或阻塞)。
https://stackoverflow.com/questions/1120088
复制相似问题