12

このパラメーターはあらゆる種類の場所 (フォーラムなど) で見られ、共通の答えは高度な同時実行サーバーに役立ちます。それでも、それが何をするのかを説明している公式のドキュメントを見つけることができません。また、それはJava 6で追加されましたか、それともJava 5に存在しましたか?

(ところで、多くのホットスポット VM パラメータの適切な場所はこのページです)

更新: Java 5 は、このパラメーターでは起動しません。

4

4 に答える 4

4

butterchicken はストーリーの半分しか説明していません。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

于 2011-06-15T19:08:40.263 に答える
2

バターチキンからの回答には同意しません。このページ http://www.md.pp.ru/~eu/jdk6options.html は、このフラグによってメモリバリアが発行され、スレッドがその状態を変更することを示しています(たとえば、RUNNABLEからWAITINGまたはBLOCKEDに)。

于 2010-01-18T14:04:34.927 に答える