我在各种地方(论坛等)看到这个参数,并且常见回答是它有助于高并发服务器。然而,我找不到来自sun官方的解释说明它的作用。此外,它是在Java 6中添加的还是在Java 5中就已经存在了?
(顺便说一句,许多Hotspot VM参数的好地方在此页面)
更新:使用此参数无法启动Java 5。
我在各种地方(论坛等)看到这个参数,并且常见回答是它有助于高并发服务器。然而,我找不到来自sun官方的解释说明它的作用。此外,它是在Java 6中添加的还是在Java 5中就已经存在了?
(顺便说一句,许多Hotspot VM参数的好地方在此页面)
更新:使用此参数无法启动Java 5。
-XX:+UseMembar
参数会导致VM恢复为真正的内存屏障指令。这个参数最初是作为新的伪屏障逻辑的验证机制而存在的,但事实证明,新的伪内存屏障代码引入了一些同步问题。我相信这些问题现在已经修复了,但在修复之前,解决这些问题的可接受方法是使用恢复的标志。// _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决定是否以严格的方式使用membar指令,强制所有内存操作在继续之前完成。
它基本上阻止了处理器的延迟内存处理优化对代码的干扰。
这通常会减慢速度,并且对于现代VM中的绝大多数代码来说是不必要的。
偶尔会遇到应该是线程安全的代码却因为缺乏membar指令而不是线程安全的情况。在这些情况下,您可以打开此选项,使此类代码正常工作,而无需切换到单线程或更改代码的顺序以防止出现问题。
JVM通常很擅长检测可能导致问题的代码,并插入membar或进行JIT代码重新排列优化,以提供时间让内存操作完成。实际上,在我进行的网络搜索中,我只发现了一个错误示例,并且它已在Oracle和OpenJRE版本的hotspot JVM的最新版本中得到修复。
需要注意的是,对于ARM架构,此选项仍然默认打开,因为尚未应用替代优化(称为伪membar优化),因此没有membar指令可能会非常有bug。