2009-07-13 15 views
12

मैं इस पैरामीटर को सभी प्रकार के स्थानों (फ़ोरम इत्यादि) में देखता हूं और सामान्य उत्तर यह अत्यधिक समवर्ती सर्वरों की सहायता करता है। फिर भी, मुझे सूर्य से एक आधिकारिक दस्तावेज नहीं मिल रहा है जो यह बताता है कि यह क्या करता है। साथ ही, क्या यह जावा 6 में जोड़ा गया था या यह जावा 5 में मौजूद था?जावा का क्या है -XX: + UseMembar पैरामीटर

(btw, कई हॉटस्पॉट वीएम मापदंडों के लिए एक अच्छी जगह this page है)

अद्यतन: जावा 5 इस पैरामीटर के साथ बूट नहीं करता है।

+1

बीटीडब्लू: -XX विकल्प आधिकारिक रूप से समर्थित नहीं हैं और बिना किसी सूचना के भविष्य के रिलीज से निकाल दिए जा सकते हैं। –

+0

@Rastislav सच है, लेकिन कई मामलों में आप उन्हें इस्तेमाल करने की जरूरत में ... –

उत्तर

11

प्रदर्शन को अनुकूलित करने के लिए, JVM कई प्रोसेसर में सिंक्रनाइज़ करते समय बाड़ लगाने के निर्देश के रूप में कार्य करने के लिए कोड में "छद्म स्मृति बाधा" का उपयोग करता है। एक "सच्चे" मेमोरी बाधा निर्देश पर वापस जाना संभव है, लेकिन प्रदर्शन पर इसका ध्यान देने योग्य (और खराब) प्रभाव हो सकता है।

-XX:+UseMembar का उपयोग वीएम को वास्तविक मेमोरी बाधा निर्देशों पर वापस लाने का कारण बनता है। यह पैरामीटर मूल रूप से नए छद्म-बाधा तर्क के सत्यापन तंत्र के रूप में अस्थायी रूप से अस्तित्व में था, लेकिन यह पता चला कि नया छद्म-स्मृति बाधा कोड कुछ सिंक्रनाइज़ेशन मुद्दों को पेश करता है। मेरा मानना ​​है कि ये अब तय किए गए हैं, लेकिन जब तक वे थे, इन मुद्दों के आसपास पहुंचने का स्वीकार्य तरीका पुनर्स्थापित ध्वज का उपयोग करना था।

बग 1.5 में पेश किया गया था, और मेरा मानना ​​है कि ध्वज 1.5 और 1.6 में मौजूद है।

मैं मेलिंग सूचियों और JVM कीड़े की एक किस्म से गूगल-fu'ed है:

+1

मुझे क्या पता नहीं है (और अच्छा लगेगा) है कैसे छद्म बाधा कोड काम करता है ... – butterchicken

+0

भी देखें http: //bugs.sun .com/bugdatabase/view_bug.do? bug_id = 6822370: इस बग के साथ नए सीपीयू और वीएम पर आपके पास बहुत अजीब सिंक्रनाइज़ेशन समस्याएं हो सकती हैं (6u18 में तय) – ankon

1

मैं डॉन मक्खन से जवाब के साथ सहमत नहीं हूँ। यह पृष्ठ http://www.md.pp.ru/~eu/jdk6options.html कहता है कि यह ध्वज स्मृति बाधाओं को जारी करने का कारण बनता है तो थ्रेड इसके राज्य को बदलता है (उदाहरण के लिए रननेबल से या ब्लॉक करने के लिए)।

+0

मुझे लगता है कि हमें सूर्य से प्रतिक्रिया देने वाले JVM डेवलपर्स पर आवश्यकता है ... –

4

बटरचिकन केवल कहानी के आधे हिस्से को बताता है, मैं kmatveev के उत्तर में अधिक विस्तार करना चाहता हूं। हां, विकल्प थ्रेड स्टेट चेंज के लिए है, और (छद्म) मेमोरी बाधाओं का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि परिवर्तन अन्य धागे, विशेष रूप से वीएम थ्रेड से दिखाई दे रहा है। 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 विकल्प के बिना, लिनक्स में, हॉटस्पॉट स्मृति बाधा अनुदेश के बजाय स्मृति serialize पेज का उपयोग करता है। जब भी एक धागा राज्य संक्रमण होता है, तो थ्रेड अस्थिर सूचक के साथ स्मृति क्रमबद्ध पृष्ठ में स्मृति स्मृति को लिखता है। जब वीएम थ्रेड को सभी धागे की अद्यतित स्थिति को देखने की आवश्यकता होती है, तो वीएम स्मृति धारावाहिक पृष्ठ के लिए सुरक्षा बिट्स को केवल पढ़ने के लिए बदलता है और फिर राज्य परिवर्तनों को क्रमबद्ध करने के लिए इसे पढ़ने/लिखने के लिए पुनः प्राप्त करता है। अधिक विस्तृत तंत्र निम्नलिखित पृष्ठ में पेश किया जाता है:

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

2

UseMembar या नहीं, एक सख्त तरीके से membar निर्देशों का उपयोग करने के लिए, आगे बढ़ने से पहले पूरा करने के लिए सभी स्मृति कार्यों के लिए मजबूर कर निर्धारित करता है।

यह मूल रूप से कोड के साथ नियंत्रित किया जाता है खिलवाड़ से प्रोसेसर की देरी स्मृति से निपटने अनुकूलन बंद हो जाता है।

यह आम तौर पर चीजों को धीमा कर देता है, और कोड के विशाल बहुमत के लिए आधुनिक वीएम पर आवश्यक नहीं है। चाहिए जहां कोड धागा सुरक्षित हो लेकिन है

कभी कभी आपको समस्या आ जाती membar अनुदेश उपयोग की कमी की वजह से नहीं। इन मामलों में आप इस कोड को एकल-थ्रेडिंग पर स्विच किए बिना या कोड को रोकने के लिए कोड के ऑर्डरिंग के साथ गड़बड़ किए बिना काम करने के लिए चालू कर सकते हैं।

JVM कोड है कि समस्याओं का कारण होगा और या तो एक membar डालने या पूरा करने के लिए स्मृति कार्यों के लिए समय प्रदान करने के लिए एक JIT कोड पुनर्व्यवस्थित अनुकूलन कर पता लगाने में आम तौर पर अच्छा है। वास्तव में, विषय पर मेरी वेब खोज में, मुझे केवल बग का एक उदाहरण मिला, और यह हॉटस्पॉट जेवीएम के ओरेकल और ओपनजेआरई संस्करणों के हाल के संस्करणों में तय किया गया था।

एक नोट के रूप में, एआरएम आर्किटेक्चर के लिए इस विकल्प को अभी भी चूक पर, क्योंकि वैकल्पिक अनुकूलन (छद्म-membar अनुकूलन के रूप में जाना जाता है) अभी तक लागू नहीं किया गया, और इस प्रकार यह विषय membar निर्देश के बिना बहुत गाड़ी हो रहा है करने के लिए।

संबंधित मुद्दे