"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > जेवीएम लॉक ऑप्टिमाइज़ेशन को समझना

जेवीएम लॉक ऑप्टिमाइज़ेशन को समझना

2024-11-08 को प्रकाशित
ब्राउज़ करें:932

Understanding JVM Lock Optimizations

मजबूत, स्केलेबल अनुप्रयोगों के विकास के लिए समवर्तीता बहुत महत्वपूर्ण है जो कई समवर्ती संचालन कर सकती है। हालाँकि, सिंक्रोनाइज़ेशन के संदर्भ में इसके लिए एक कीमत चुकानी होगी। ताले प्राप्त करने और जारी करने के अतिरिक्त खर्चों के कारण इसमें प्रदर्शन लागत आती है। इन प्रदर्शन लागतों को कम करने के लिए, जेवीएम में कई अनुकूलन शामिल किए गए हैं, कई स्वादों में, जैसे कि पक्षपाती लॉकिंग, लॉक उन्मूलन, लॉक मोटेशन, और हल्के और भारी वजन वाले ताले की धारणा।

इस लेख में, हम इन अनुकूलनों को अधिक विस्तार से देखते हैं, यह देखते हुए कि वे बहु-थ्रेडेड जावा अनुप्रयोगों में सिंक्रनाइज़ेशन को कैसे बेहतर बनाते हैं।

जावा लॉकिंग मूल बातें

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

हालांकि थ्रेड सुरक्षा के लिए सिंक्रोनाइज़ेशन एक आवश्यकता है, लेकिन जब विवाद कम हो या पूरी तरह से अनुपस्थित हो तो यह काफी महंगा हो सकता है। यहीं पर जेवीएम अनुकूलन फ्रेम में कदम रखता है। इस प्रकार, इससे लॉकिंग की लागत कम हो जाएगी और समग्र प्रदर्शन में वृद्धि होगी।

1. पक्षपातपूर्ण लॉकिंग

बायस्ड लॉकिंग क्या है?

बायस्ड लॉकिंग एक अनुकूलन है जिसका लक्ष्य लॉक अधिग्रहण के ओवरहेड को कम करना है। इसे लॉक अधिग्रहण की लागत को कम करने के लिए अनुकूलित किया गया है, जिस पर एक ही थ्रेड का प्रभुत्व होता है या अधिकांशतः एक ही थ्रेड द्वारा एक्सेस किया जाता है। ऐसे प्रोग्राम अक्सर एक ही थ्रेड द्वारा लॉक प्राप्त करते हैं और जारी करते हैं, अन्य थ्रेड से कोई विवाद नहीं होता है। जेवीएम इस पैटर्न को पहचान सकता है और लॉक को उस विशेष थ्रेड पर बायस कर सकता है; निम्नलिखित लॉक अधिग्रहण लगभग मुफ्त में आता है।

बायस्ड लॉकिंग कैसे काम करती है?

यदि बायस्ड लॉकिंग सक्षम है, तो पहली बार जब कोई थ्रेड लॉक प्राप्त करता है, तो यह उस लॉक को उस थ्रेड के प्रति बायस्ड बना देता है। थ्रेड की पहचान लॉक ऑब्जेक्ट के हेडर में दर्ज की जाती है, और उस थ्रेड द्वारा बाद में लॉक अधिग्रहण में कोई भी सिंक्रनाइज़ेशन शामिल नहीं होता है - वे सिर्फ यह जांचते हैं कि क्या लॉक वर्तमान थ्रेड की ओर पक्षपाती है, जो एक बहुत तेज़, गैर-अवरुद्ध ऑपरेशन है .

यदि कोई अन्य थ्रेड लॉक प्राप्त करने का प्रयास करता है, तो पूर्वाग्रह रद्द हो जाता है और जेवीएम एक मानक निष्पक्ष लॉकिंग तंत्र पर वापस आ जाता है। इस स्तर पर, यह अब एक मानक लॉक है, और दूसरे धागे को इसे एक मानक लॉकिंग प्रक्रिया के माध्यम से प्राप्त करना होगा।
बायस्ड लॉकिंग के लाभ

प्रदर्शन: एक बायस्ड लॉक पर एक ही धागे का अधिग्रहण लगभग एक फ्री लॉक अधिग्रहण है।

इसलिए, विवाद प्रबंधन की आवश्यकता नहीं है क्योंकि अन्य थ्रेड्स के पास लॉक प्राप्त करने में शामिल होने का कोई मौका नहीं है।

निचला ओवरहेड: विवाद की स्थिति को छोड़कर लॉक की स्थिति को बदलने या सिंक्रनाइज़ेशन-संबंधी मेटाडेटा को संशोधित करने की आवश्यकता नहीं है। 
 

बायस्ड लॉकिंग का उपयोग कब किया जाता है?

बायस्ड लॉकिंग उन अनुप्रयोगों में उपयोगी है जहां लॉक को मुख्य रूप से एक ही थ्रेड द्वारा एक्सेस किया जाता है, जैसे सिंगल-थ्रेडेड एप्लिकेशन या मल्टी-थ्रेडिंग के तहत कम लॉक कंटेंट वाला एप्लिकेशन। अधिकांश JVMs में यह डिफ़ॉल्ट रूप से सक्षम है।

बायस्ड लॉकिंग को कैसे अक्षम करें

बायस्ड लॉकिंग डिफ़ॉल्ट रूप से सक्षम है लेकिन इसे नीचे दिए गए जेवीएम ध्वज के साथ भी अक्षम किया जा सकता है:

-XX:-UseBiasedLocking

2. लॉक उन्मूलन

लॉक एलिमिनेशन क्या है?

लॉक एलिमिनेशन एक बहुत शक्तिशाली अनुकूलन है जिसमें जेवीएम कुछ अनावश्यक सिंक्रनाइज़ेशन (लॉक) को पूरी तरह से समाप्त कर देता है। यह अपने JIT संकलन के दौरान किसी भी अवसर के लिए कोड का निरीक्षण करेगा जिसमें उसे पता चलेगा कि सिंक्रनाइज़ेशन आवश्यक नहीं है। यह आमतौर पर तब होता है जब लॉक को केवल एक थ्रेड द्वारा एक्सेस किया गया हो, या जिस ऑब्जेक्ट को सिंक्रनाइज़ करने के लिए JVM का उपयोग किया जाएगा वह एक ही ऑब्जेक्ट को विभिन्न थ्रेड्स के भीतर साझा नहीं करता है। एक बार जब जेवीएम को लगता है कि अब इसकी आवश्यकता नहीं है, तो यह लॉक को हटा देता है।

लॉक एलिमिनेशन कैसे काम करता है?

जेआईटी संकलन के एस्केप विश्लेषण चरण में, जेवीएम यह जांचता है कि क्या ऑब्जेक्ट एक ही थ्रेड तक सीमित है या केवल स्थानीय संदर्भ में उपयोग किया जाता है। यदि उस ऑब्जेक्ट पर सिंक्रोनाइज़ेशन को हटाया जा सकता है क्योंकि कोई ऑब्जेक्ट उस थ्रेड के दायरे से बाहर नहीं निकलता है जिसने इसे बनाया है, तो ऐसा ही होगा।

उदाहरण के लिए, यदि कोई ऑब्जेक्ट पूरी तरह से एक विधि के भीतर बनाया और उपयोग किया जाता है (और थ्रेड्स में साझा नहीं किया जाता है) तो जेवीएम को पता चलता है कि कोई अन्य थ्रेड संभवतः ऑब्जेक्ट तक नहीं पहुंच सकता है, और इस प्रकार सभी सिंक्रनाइज़ेशन अनावश्यक है। ऐसे मामले में, JIT कंपाइलर लॉक को पूरी तरह से हटा देता है।

जीरो लॉकिंग ओवरहेड: अनावश्यक सिंक्रनाइज़ेशन को खत्म करने से जेवीएम को पहले स्थान पर ताले प्राप्त करने और जारी करने की लागत का भुगतान करने से भी रोका जा सकेगा।

उच्च थ्रूपुट: डेड सिंक कभी-कभी एप्लिकेशन के उच्च थ्रूपुट का कारण बन सकता है, खासकर यदि कोड में कई सिंक्रनाइज़ ब्लॉक हों।

कोड के इस टुकड़े पर एक नज़र डालें:

public void someMethod() {
    StringBuilder sb = new StringBuilder();
    synchronized (sb) {
        sb.append("Hello");
        sb.append("World");
    }
}

इस मामले में, sb पर सिंक्रनाइज़ेशन आवश्यक नहीं है क्योंकि StringBuilder का उपयोग केवल someMethod के भीतर किया जाता है और अन्य थ्रेड्स के बीच साझा नहीं किया जाता है। इसे देखकर, जेवीएम लॉक को हटाने के लिए एस्केप विश्लेषण कर सकता है।

3. लॉक को मोटा करना

लॉक कॉर्सनिंग क्या है?

लॉक कोर्सनिंग एक अनुकूलन है जिसमें जेवीएम लूप या कोड के छोटे खंडों में लॉक को लगातार प्राप्त करने और जारी करने के बजाय कोड के अधिक हिस्सों को कवर करने के लिए लॉक के दायरे का विस्तार करता है।

ताला मोटे करने का कार्य

यदि जेवीएम को पता चलता है कि एक टाइट लूप या एकाधिक आसन्न कोड ब्लॉक बहुत बार लॉक प्राप्त करते हैं और जारी करते हैं, तो यह लॉक को लूप के बाहर या कोड के कई ब्लॉकों में ले जाकर लॉक को मोटा कर सकता है। इससे लॉकलेस का बार-बार अधिग्रहण और रिलीज महंगा हो जाता है और थ्रेड अधिक पुनरावृत्तियों के लिए लॉक को पकड़ने में सक्षम हो जाता है।

कोड उदाहरण: लॉक को मोटा करना

इस कोड स्निपेट पर विचार करें:

for (int i = 0; i 



लॉक को मोटा करने से लॉक अधिग्रहण को लूप के बाहर धकेल दिया जाता है, इसलिए थ्रेड केवल एक बार लॉक प्राप्त करता है:

synchronized (lock) {
  for (int i = 0; i 



जेवीएम लॉक के अधिक अधिग्रहण और रिलीज से बचकर प्रदर्शन में नाटकीय रूप से सुधार कर सकता है।

ताला मोटे करने के लाभ

लॉकिंग ओवरहेड्स की कम स्वतंत्रता: कोअरसिंग लॉक अधिग्रहण और रिलीज से बचाता है, विशेष रूप से हॉटस्पॉट कोड में, जैसे लूप जिन्हें हजारों बार दोहराया गया है।

बेहतर प्रदर्शन:
उस परिदृश्य की तुलना में लंबी अवधि के लिए लॉक करने से प्रदर्शन में सुधार होता है, जिसमें लॉक किए बिना, ऐसे लॉक को कई बार हासिल किया जाएगा और जारी किया जाएगा।

4. हल्के वजन और भारी वजन वाले ताले

जेवीएम थ्रेड्स के बीच विवाद की डिग्री के आधार पर दो अलग-अलग लॉकिंग तकनीकों का उपयोग करता है। ऐसी तकनीकों में हल्के ताले और भारी वजन वाले ताले शामिल हैं।

हल्के वजन का लॉकिंग

कंटेंट लॉक की अनुपस्थिति में लाइटवेट लॉकिंग होती है, जिसका अर्थ है कि केवल एक थ्रेड उस लॉक को प्राप्त करने का प्रयास कर रहा है। ऐसे परिदृश्यों में, JVM लॉक प्राप्त करने का प्रयास करते समय CAS ऑपरेशन का उपयोग करके अधिग्रहण को अनुकूलित करता है, जो हैवीवेट सिंक्रनाइज़ेशन के बिना हो सकता है।

हैवीवेट लॉकिंग

यदि एकाधिक थ्रेड एक ही लॉक प्राप्त करना चाहते हैं; यानी, विवाद है, जेवीएम इसे हेवीवेट लॉकिंग तक बढ़ा देता है। इसमें ओएस स्तर पर थ्रेड्स को अवरुद्ध करना और ओएस-स्तरीय सिंक्रोनाइज़ेशन प्रिमिटिव का उपयोग करके उन्हें प्रबंधित करना शामिल होगा। हेवीवेट ताले धीमे होते हैं क्योंकि उन्हें वास्तव में संदर्भ स्विचिंग के साथ-साथ थ्रेड्स को प्रबंधित करने के लिए ओएस की आवश्यकता होती है।

लॉक एस्केलेशन

यदि हल्के वजन वाले लॉक पर विवाद उत्पन्न होता है, तो जेवीएम इसे हेवीवेट लॉक तक बढ़ा सकता है। यहां एस्केलेशन का मतलब है तेज, उपयोगकर्ता-स्तरीय लॉक से अधिक महंगे, ओएस-स्तरीय लॉक पर स्विच करना जिसमें थ्रेड ब्लॉकिंग शामिल है।

हल्के ताले के लाभ

ताले का तेजी से अधिग्रहण: जब कोई विवाद नहीं होता है, तो हल्के ताले भारी वजन वाले तालों की तुलना में कहीं अधिक तेज होते हैं क्योंकि वे ओएस-स्तरीय सिंक्रनाइज़ेशन से बचते हैं।

कम अवरोधन: बिना किसी विवाद के, थ्रेड अवरुद्ध नहीं होते हैं और कम विलंबता के साथ रैखिक रूप से बढ़ते हैं।

हैवीवेट ताले के नुकसान

प्रदर्शन ओवरहेड: हैवीवेट ताले में थ्रेड ब्लॉकिंग, संदर्भ स्विचिंग और बहुत उच्च विवाद शासनों में प्रदर्शन में गिरावट के साथ थ्रेड को जगाने की लागत आती है।

ये सभी अनुकूलन जेवीएम को बहु-थ्रेडेड अनुप्रयोगों में प्रदर्शन को बेहतर बनाने में मदद करते हैं, इसलिए डेवलपर्स अब सिंक्रोनाइज़ेशन ओवरहेड के रास्ते में ज्यादा समझौता किए बिना सुरक्षित, समवर्ती कोड लिख सकते हैं। इन अनुकूलन को समझने से डेवलपर्स को अधिक कुशल सिस्टम डिज़ाइन करने में मदद मिल सकती है, खासकर उन मामलों में जिनमें लॉकिंग के लिए उच्च-प्रदर्शन जुर्माना है।

विज्ञप्ति वक्तव्य यह आलेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/arashariani/understandard-jvm-lock-optimizations-4l5i?1 यदि कोई उल्लंघन है, तो कृपया इसे हटाने के लिए [email protected] से संपर्क करें।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3