Что такое параметр Java-XX: + UseMembar

Я вижу этот параметр в разных местах (форумах и т. д.) и общий ответ на него помогают сильно параллельные серверы. Тем не менее, я не могу найти официальную документацию от sun, объясняющую, что она делает. Кроме того, он был добавлен в Java 6 или существовал в Java 5?

(кстати, хорошим местом для многих параметров hotspot VM является на этой странице)

обновление: Java 5 Не загружается с этим параметром.

4 ответов


для оптимизации производительности JVM использует "псевдо-барьер памяти" в коде, чтобы действовать как инструкция ограждения при синхронизации между несколькими процессорами. Можно вернуться к" истинной " инструкции барьера памяти, но это может иметь заметный (и плохой) эффект на производительность.

использование -XX:+UseMembar заставляет VM вернуться к инструкциям true Memory barrier. Первоначально предполагалось, что этот параметр будет временно существовать в качестве механизма проверки нового псевдо-барьер логику, но оказалось, что новый псевдо-памяти код ввели некоторые проблемы синхронизации. Я считаю, что теперь они исправлены, но пока они не были, приемлемым способом обойти эти проблемы было использовать восстановленный флаг.

ошибка была введена в 1.5, и я считаю, что флаг существует в 1.5 и 1.6.

Я google-fu'Ed это из различных списков рассылки и JVM Багз:


butterchicken объясняет только половину истории, я хотел бы добавить больше деталей к ответу кматвеева. Да, опция предназначена для изменения состояния потока, и (псевдо) барьеры памяти используются для обеспечения того, чтобы изменение было видно из других потоков, особенно потока 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 использует страницу сериализации памяти вместо инструкции по барьеру памяти. Всякий раз, когда переход состояния потока бывает, нить записывает на адрес памяти в памяти сериализовать страницу с изменчивым указателем. Когда потоку виртуальной машины необходимо просмотреть обновленное состояние всех потоков, виртуальная машина изменяет биты защиты для страницы сериализации памяти только для чтения, а затем восстанавливает ее для чтения/записи для сериализации изменений состояния. Более подробный механизм представлен на следующей странице:

http://home.comcast.net/~pjbishop/Dave/Asymmetric-Dekker-Synchronization.txt


UseMembar определяет, следует ли использовать инструкции membar строго, заставляя все действия памяти завершаться перед продолжением.

Это в основном останавливает оптимизацию обработки отложенной памяти процессора от возни с кодом обрабатывается.

это обычно замедляет работу и не является необходимым для современных виртуальных машин для подавляющего большинства кода.

иногда вы сталкиваетесь с проблемами, когда код должен быть потокобезопасным, но не потому, что отсутствие использования инструкций membar. В этих случаях вы можете включить это, чтобы заставить такой код работать без переключения на однопоточность или возиться с порядком кода, чтобы предотвратить проблему.

JVM обычно хорошо обнаруживает код, который вызовет проблемы, и либо вставляет membar, либо выполняет оптимизацию перестановки JIT-кода, чтобы обеспечить время для завершения операций с памятью. На самом деле, в моем веб-поиске по этой теме я нашел только один пример ошибки, и это было исправлено в последних версиях Oracle и OpenJRE версий hotspot JVM.

Как примечание, для архитектур ARM эта опция по-прежнему по умолчанию включена, потому что альтернативные оптимизации (известные как оптимизации psuedo-membar) еще не применялись, и поэтому она может быть очень глючной без инструкций membar.


Я не согласен с ответом от butterchicken. Эта страница http://www.md.pp.ru / ~eu/jdk6options.html говорит, что этот флаг вызывает барьеры памяти, которые будут выданы, а затем поток изменяет его состояние (например, от RUNNABLE до ожидания или блокировки).