2009-07-13 4 views
12

이 매개 변수는 모든 종류의 장소 (포럼 등)에서 볼 수 있으며 공통적 인 대답은 매우 동시적인 서버에 도움이됩니다. 아직도, 나는 그것이하는 것을 설명하는 태양으로부터의 공식 문서를 찾을 수 없다. 또한 Java 6에서 추가 되었습니까? 아니면 Java 5에서 존재 했습니까?Java의 -XX : + UseMembar 매개 변수는 무엇입니까?

(BTW, 많은 핫스팟 VM 매개 변수에 대한 좋은 장소가 this page입니다)

업데이트 : 자바 5이 매개 변수를 사용하여 부팅되지 않습니다.

+1

BTW : -XX 옵션은 공식적으로 지원되지 않으며 향후 릴리스에서 알림없이 제거 할 수 있습니다. –

+0

@Rastislav 사실이지만, 많은 경우에 당신은 그것들을 사용할 필요가 있습니다 ... –

답변

11

성능을 최적화하기 위해 JVM은 코드에서 "의사 메모리 장벽"을 사용하여 여러 프로세서에서 동기화 할 때 펜싱 명령어로 작동합니다. "진정한"메모리 장벽 명령으로 되돌릴 수는 있지만, 성능에 눈에 띄는 (및 나쁜) 영향을 미칠 수 있습니다.

-XX:+UseMembar을 사용하면 VM이 실제 메모리 장벽 명령으로 되돌아갑니다. 이 매개 변수는 원래 새로운 의사 장벽 논리의 확인 메커니즘으로 일시적으로 존재하기 위해 의도되었지만 새로운 의사 메모리 장벽 코드는 동기화 문제를 가져온 것으로 나타났습니다. 나는 이것들이 현재 고정되어 있다고 생각하지만, 그럴 때까지는이 문제를 해결할 수있는 방법은 회복 된 깃발을 사용하는 것이었다.

버그가 1.5에서 도입되었으며 플래그가 1.5와 1.6에 있다고 생각합니다.

나는 메일 링리스트와 JVM 버그의 다양한이 구글-fu'ed했습니다

+1

모호한 것은 장벽 코드가 작동하는 방법입니다 ... – butterchicken

+0

또한 http : //bugs.sun을 참조하십시오. .com/bugdatabase/view_bug.do? bug_id = 6822370 :이 버그가있는 최신 CPU 및 VM에서 매우 이상한 동기화 문제가 발생할 수 있습니다. (6u18에서 수정 됨) – ankon

1

I 돈 버터 치킨의 대답에 동의하지 않습니다. 이 페이지 http://www.md.pp.ru/~eu/jdk6options.html 이 플래그는 메모리 장벽이 발행 된 다음 스레드가 상태를 변경합니다 (예 : RUNNABLE에서 WAITING 또는 BLOCKED로 변경됨).

+0

Sun의 응답으로 JVM 개발자가 필요합니다. –

4

butterchicken은 이야기의 절반만을 설명하며, 나는 kmatveev의 대답에 대해 더 자세하게 설명하고 싶습니다. 예, 스레드 상태 변경에 대한 옵션이며 (가상) 메모리 장벽을 사용하여 다른 스레드, 특히 VM 스레드에서 변경 사항을 볼 수 있습니다. 다음과 같이 OpenJDK6에 사용되는 스레드의 상태는 다음과 같습니다 UseMembar 옵션을 사용하지 않고

// _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 

을, 리눅스, 핫스팟 메모리 장벽 명령 대신 메모리 직렬화 페이지를 사용합니다. 스레드 상태가 전환 될 때마다 스레드는 메모리의 메모리 주소에 쓰고 휘발성 포인터가있는 페이지를 직렬화합니다. VM 스레드가 모든 스레드의 최신 상태를 확인해야 할 때 VM은 메모리 직렬화 페이지의 보호 비트를 읽기 전용으로 변경 한 다음 읽기/쓰기로 복구하여 상태 변경을 직렬화합니다. 더 자세한 메커니즘은 다음 페이지에서 소개 :

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

2

UseMembar 계속하기 전에 완료하는 모든 메모리 작업을 강제로 엄격한 방식은 membar 지침을 사용할지 여부를 결정합니다.

기본적으로 프로세서의 지연된 메모리 처리가 중지되어 코드가 엉망이되어 최적화가 처리됩니다.

이렇게하면 대개 속도가 느려지므로 대다수 코드의 경우 최신 VM에서는 필요하지 않습니다.

때때로 코드는 스레드 안전성이 있어야하지만 membar 명령 사용이 부족하기 때문에 발생하지 않는 문제가 발생합니다. 이 경우이 코드를 켜면 단일 스레드로 전환하거나 문제를 방지하기 위해 코드의 순서를 바꾸는 일없이 해당 코드를 사용할 수 있습니다.

JVM은 일반적으로 membar를 삽입하거나 JIT 코드 재 배열 최적화를 수행하여 메모리 조작이 완료 될 때까지 시간을 제공합니다. 사실, 주제에 대한 웹 검색에서 나는 단지 버그의 한 예를 발견했으며 오라클과 OpenJRE 버전의 핫스팟 JVM의 최신 버전에서 수정되었습니다.

참고로 ARM 아키텍처의 경우 대체 최적화 (psuedo membar 최적화라고 함)가 아직 적용되지 않았으므로이 옵션은 여전히 ​​on으로 설정되어 있으므로 membar 명령 없이는 매우 버그가있을 수 있습니다.