首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是Java的-XX:+UseMembar参数

什么是Java的-XX:+UseMembar参数
EN

Stack Overflow用户
提问于 2009-07-13 15:16:44
回答 4查看 8.8K关注 0票数 13

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

(顺便说一句,此页是许多热点VM参数的好地方)

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-07-13 16:03:16

为了优化性能,JVM在代码中使用“伪内存屏障”,在跨多个处理器进行同步时充当隔离指令。恢复到“真”内存屏障指令是可能的,但这可能会对性能产生明显的(和坏的)影响。

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

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

我已经从各种邮件列表和JVM错误中获得了这一信息:

票数 13
EN

Stack Overflow用户

发布于 2011-06-15 19:08:40

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

代码语言:javascript
复制
//  _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

票数 5
EN

Stack Overflow用户

发布于 2010-01-18 14:04:34

我不同意蝴蝶鸡的回答。此页面http://www.md.pp.ru/~eu/jdk6options.html表示,此标志将导致发出内存屏障,然后线程更改其状态(例如,从可运行到等待或阻塞)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1120088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档