अखंड संरचनाओं से लेकर वितरित प्रणालियों की दुनिया तक, अनुप्रयोग विकास ने एक लंबा सफर तय किया है। क्लाउड कंप्यूटिंग और माइक्रोसर्विस आर्किटेक्चर को बड़े पैमाने पर अपनाने से सर्वर एप्लिकेशन बनाने और तैनात करने के तरीके में काफी बदलाव आया है। विशाल एप्लिकेशन सर्वरों के बजाय, अब हमारे पास स्वतंत्र, व्यक्तिगत रूप से तैनात सेवाएँ हैं जो क्रियान्वित होती हैं
जब भी जरूरत हो।
हालाँकि, ब्लॉक पर एक नया खिलाड़ी जो इस सुचारू कामकाज को प्रभावित कर सकता है वह हो सकता है 'कोल्ड स्टार्ट्स।' जब एक नए पैदा हुए कर्मचारी पर पहला अनुरोध संसाधित होता है तो कोल्ड स्टार्ट शुरू हो जाता है। यह स्थिति वास्तविक अनुरोध को संसाधित करने से पहले भाषा रनटाइम आरंभीकरण और सेवा कॉन्फ़िगरेशन आरंभीकरण की मांग करती है। कोल्ड स्टार्ट से जुड़ी अप्रत्याशितता और धीमा निष्पादन क्लाउड सेवा के सेवा स्तर के समझौतों का उल्लंघन कर सकता है। तो, इस बढ़ती चिंता का मुकाबला कैसे किया जाए?
कोल्ड स्टार्ट की अक्षमताओं से निपटने के लिए, एक नया दृष्टिकोण विकसित किया गया है जिसमें पॉइंट-टू विश्लेषण, बिल्ड टाइम पर एप्लिकेशन इनिशियलाइज़ेशन, हीप स्नैपशॉटिंग और समय से पहले (AOT) संकलन शामिल है। यह विधि एक बंद दुनिया की धारणा के तहत काम करती है, जिसके लिए सभी जावा कक्षाओं को पूर्व निर्धारित और निर्माण समय पर पहुंच योग्य होना आवश्यक है। इस चरण के दौरान, एक व्यापक पॉइंट-टू-विश्लेषण सभी पहुंच योग्य प्रोग्राम तत्वों (कक्षाएं, विधियां, फ़ील्ड) को निर्धारित करता है ताकि यह सुनिश्चित किया जा सके कि केवल आवश्यक जावा विधियां संकलित की गई हैं।
एप्लिकेशन के लिए इनिशियलाइज़ेशन कोड रनटाइम के बजाय बिल्ड प्रक्रिया के दौरान निष्पादित हो सकता है। यह जावा ऑब्जेक्ट के पूर्व-आवंटन और जटिल डेटा संरचनाओं के निर्माण की अनुमति देता है, जिन्हें बाद में "छवि ढेर" के माध्यम से रनटाइम पर उपलब्ध कराया जाता है। यह छवि ढेर निष्पादन योग्य के भीतर एकीकृत है, जो एप्लिकेशन शुरू होने पर तत्काल उपलब्धता प्रदान करता है।
पॉइंट-टू-विश्लेषण और स्नैपशॉटिंग का पुनरावृत्त निष्पादन तब तक जारी रहता है जब तक कि एक स्थिर स्थिति (निश्चित बिंदु) प्राप्त नहीं हो जाती, जो स्टार्टअप समय और संसाधन खपत दोनों को अनुकूलित करती है।
हमारे सिस्टम के लिए इनपुट जावा बाइटकोड है, जो जावा, स्काला या कोटलिन जैसी भाषाओं से उत्पन्न हो सकता है। यह प्रक्रिया एक ऑपरेटिंग सिस्टम और आर्किटेक्चर के लिए विशिष्ट मूल निष्पादन योग्य उत्पादन करने के लिए एप्लिकेशन, उसके पुस्तकालयों, जेडीके और वीएम घटकों को समान रूप से व्यवहार करती है - जिसे "मूल छवि" कहा जाता है। निर्माण प्रक्रिया में एक निश्चित बिंदु तक पहुंचने तक पुनरावृत्त बिंदुओं का विश्लेषण और हीप स्नैपशॉटिंग शामिल होती है, जिससे एप्लिकेशन को पंजीकृत कॉलबैक के माध्यम से सक्रिय रूप से भाग लेने की अनुमति मिलती है। इन चरणों को सामूहिक रूप से मूल छवि निर्माण प्रक्रिया के रूप में जाना जाता है (चित्र 1)
चित्रा 1 - मूल छवि निर्माण प्रक्रिया(स्रोत: redhat.com)
हम रनटाइम के दौरान कक्षाओं, विधियों और क्षेत्रों की पहुंच का पता लगाने के लिए पॉइंट-टू विश्लेषण का उपयोग करते हैं। पॉइंट-टू विश्लेषण सभी प्रवेश बिंदुओं से शुरू होता है, जैसे कि एप्लिकेशन की मुख्य विधि, और एक निश्चित बिंदु तक पहुंचने तक सभी परिवर्तनीय रूप से पहुंच योग्य तरीकों को पुनरावृत्त रूप से पार करता है (चित्र 2)।
चित्रा 2 - विश्लेषण के बिंदु
हमारा पॉइंट-टू विश्लेषण कंपाइलर के उच्च-स्तरीय मध्यवर्ती प्रतिनिधित्व (IR) में जावा बाइटकोड को पार्स करने के लिए हमारे कंपाइलर के फ्रंट एंड का लाभ उठाता है। इसके बाद, आईआर एक प्रकार-प्रवाह ग्राफ में तब्दील हो जाता है। इस ग्राफ़ में, नोड्स ऑब्जेक्ट प्रकारों पर काम करने वाले निर्देशों का प्रतिनिधित्व करते हैं, जबकि किनारे नोड्स के बीच निर्देशित उपयोग किनारों को दर्शाते हैं, जो परिभाषा से उपयोग की ओर इशारा करते हैं। प्रत्येक नोड एक प्रकार की स्थिति बनाए रखता है, जिसमें उन प्रकारों की एक सूची शामिल होती है जो नोड और अशक्तता की जानकारी तक पहुंच सकते हैं। प्रकार की अवस्थाएँ उपयोग किनारों के माध्यम से फैलती हैं; यदि किसी नोड की प्रकार स्थिति बदलती है, तो यह परिवर्तन सभी उपयोगों के लिए प्रसारित किया जाता है। महत्वपूर्ण बात यह है कि प्रकार की अवस्थाएँ केवल विस्तारित हो सकती हैं; नए प्रकारों को एक प्रकार की स्थिति में जोड़ा जा सकता है, लेकिन मौजूदा प्रकारों को कभी नहीं हटाया जाता है। यह तंत्र सुनिश्चित करता है कि
विश्लेषण अंततः एक निश्चित बिंदु पर एकत्रित होता है, जिससे समाप्ति होती है।
पॉइंट-टू विश्लेषण आरंभीकरण कोड के निष्पादन का मार्गदर्शन करता है जब यह एक स्थानीय निश्चित बिंदु पर पहुंचता है। इस कोड की उत्पत्ति दो अलग-अलग स्रोतों में हुई है: क्लास इनिशियलाइज़र और कस्टम कोड बैच जो फीचर इंटरफ़ेस के माध्यम से बिल्ड समय पर निष्पादित होते हैं:
क्लास इनिशियलाइज़र: प्रत्येक जावा क्लास में
स्पष्ट कॉलबैक: डेवलपर्स हमारे सिस्टम द्वारा प्रदान किए गए हुक के माध्यम से कस्टम कोड लागू कर सकते हैं, विश्लेषण चरणों से पहले, दौरान या बाद में निष्पादित कर सकते हैं।
यहां हमारे सिस्टम के साथ एकीकरण के लिए एपीआई प्रदान की गई हैं।
boolean isReachable(Class> clazz); boolean isReachable(Field field); boolean isReachable(Executable method);
अधिक जानकारी के लिए, QueryReachabilityAccess देखें
void registerReachabilityHandler(Consumercallback, Object... elements); void registerSubtypeReachabilityHandler(BiConsumer > callback, Class> baseClass); void registerMethodOverrideReachabilityHandler(BiConsumer callback, Executable baseMethod);
अधिक जानकारी के लिए, beforeAnalysisAccess देखें
इस चरण के दौरान, एप्लिकेशन कस्टम कोड निष्पादित कर सकता है जैसे ऑब्जेक्ट आवंटन और बड़े डेटा संरचनाओं का आरंभीकरण। महत्वपूर्ण बात यह है कि इनिशियलाइज़ेशन कोड वर्तमान पॉइंट-टू-विश्लेषण स्थिति तक पहुंच सकता है, जिससे प्रकार, विधियों या फ़ील्ड की पहुंच के बारे में प्रश्न पूछे जा सकते हैं। यह ड्यूरिंगएनालिसिसएक्सेस द्वारा प्रदान की गई विभिन्न isReachable() विधियों का उपयोग करके पूरा किया जाता है। इस जानकारी का लाभ उठाते हुए, एप्लिकेशन एप्लिकेशन के पहुंच योग्य खंडों के लिए अनुकूलित डेटा संरचनाओं का निर्माण कर सकता है।
अंत में, हीप स्नैपशॉटिंग सभी पहुंच योग्य वस्तुओं का एक व्यापक दृश्य बनाने के लिए स्थिर फ़ील्ड जैसे रूट पॉइंटर्स का पालन करके एक ऑब्जेक्ट ग्राफ़ बनाता है। यह ग्राफ़ तब मूल छवि को पॉप्युलेट करता है
छवि ढेर, यह सुनिश्चित करते हुए कि एप्लिकेशन की प्रारंभिक स्थिति स्टार्टअप पर कुशलतापूर्वक लोड की गई है।
पहुंच योग्य वस्तुओं के ट्रांजिटिव क्लोजर को उत्पन्न करने के लिए, एल्गोरिदम ऑब्जेक्ट फ़ील्ड्स को पार करता है, प्रतिबिंब का उपयोग करके उनके मूल्यों को पढ़ता है। यह ध्यान रखना महत्वपूर्ण है कि छवि बिल्डर जावा वातावरण में काम करता है। इस ट्रैवर्सल के दौरान पॉइंट-टू विश्लेषण द्वारा "रीड" के रूप में चिह्नित केवल उदाहरण फ़ील्ड पर विचार किया जाता है। उदाहरण के लिए, यदि किसी वर्ग में दो इंस्टेंस फ़ील्ड हैं, लेकिन एक को पठित के रूप में चिह्नित नहीं किया गया है, तो अचिह्नित फ़ील्ड के माध्यम से पहुंचने योग्य ऑब्जेक्ट को छवि ढेर से बाहर रखा गया है।
किसी फ़ील्ड मान का सामना करते समय, जिसका वर्ग पहले पॉइंट-टू विश्लेषण द्वारा पहचाना नहीं गया है, वर्ग को फ़ील्ड प्रकार के रूप में पंजीकृत किया जाता है। यह पंजीकरण सुनिश्चित करता है कि पॉइंट-टू विश्लेषण के बाद के पुनरावृत्तियों में, नए प्रकार को टाइप-फ्लो ग्राफ़ में सभी फ़ील्ड रीड्स और ट्रांजिटिव उपयोगों के लिए प्रचारित किया जाता है।
नीचे दिया गया कोड स्निपेट हीप स्नैपशॉटिंग के लिए मुख्य एल्गोरिदम की रूपरेखा देता है:
Declare List worklist := [] Declare Set reachableObjects := [] Function BuildHeapSnapshot(PointsToState pointsToState) For Each field in pointsToState.getReachableStaticObjectFields() Call AddObjectToWorkList(field.readValue()) End For For Each method in pointsToState.getReachableMethods() For Each constant in method.embeddedConstants() Call AddObjectToWorkList(constant) End For End For While worklist.isNotEmpty Object current := Pop from worklist If current Object is an Array For Each value in current Call AddObjectToWorkList(value) Add current.getClass() to pointsToState.getObjectArrayTypes() End For Else For Each field in pointsToState.getReachableInstanceObjectFields(current.getClass()) Object value := field.read(current) Call AddObjectToWorkList(value) Add value.getClass() to pointsToState.getFieldValueTypes(field) End For End If End While Return reachableObjects End Function
संक्षेप में, हीप स्नैपशॉटिंग एल्गोरिदम कुशलतापूर्वक पहुंच योग्य वस्तुओं और उनके क्षेत्रों को व्यवस्थित रूप से पार करके हीप का एक स्नैपशॉट बनाता है। यह सुनिश्चित करता है कि छवि ढेर में केवल प्रासंगिक ऑब्जेक्ट शामिल हैं, जो मूल छवि के प्रदर्शन और मेमोरी फ़ुटप्रिंट को अनुकूलित करता है।
निष्कर्षतः, हीप स्नैपशॉटिंग की प्रक्रिया मूल छवियों के निर्माण में महत्वपूर्ण भूमिका निभाती है। पहुंच योग्य वस्तुओं और उनके क्षेत्रों को व्यवस्थित रूप से पार करके, हीप स्नैपशॉटिंग एल्गोरिदम एक ऑब्जेक्ट ग्राफ़ बनाता है जो स्थिर फ़ील्ड जैसे रूट पॉइंटर्स से पहुंच योग्य वस्तुओं के संक्रमणीय समापन का प्रतिनिधित्व करता है। यह ऑब्जेक्ट ग्राफ़ तब मूल छवि में छवि ढेर के रूप में एम्बेड किया जाता है, जो मूल छवि स्टार्टअप पर प्रारंभिक ढेर के रूप में कार्य करता है।
पूरी प्रक्रिया में, एल्गोरिथ्म यह निर्धारित करने के लिए पॉइंट-टू-विश्लेषण की स्थिति पर निर्भर करता है कि कौन सी वस्तुएं और फ़ील्ड छवि ढेर में शामिल करने के लिए प्रासंगिक हैं। पॉइंट-टू विश्लेषण द्वारा "पठित" के रूप में चिह्नित वस्तुओं और फ़ील्ड पर विचार किया जाता है, जबकि अचिह्नित संस्थाओं को बाहर रखा जाता है। इसके अतिरिक्त, जब पहले से अनदेखे प्रकारों का सामना होता है, तो एल्गोरिदम उन्हें पॉइंट-टू विश्लेषण के बाद के पुनरावृत्तियों में प्रसार के लिए पंजीकृत करता है।
कुल मिलाकर, हीप स्नैपशॉटिंग यह सुनिश्चित करके मूल छवियों के प्रदर्शन और मेमोरी उपयोग को अनुकूलित करता है कि छवि हीप में केवल आवश्यक ऑब्जेक्ट शामिल हैं। यह व्यवस्थित दृष्टिकोण मूल छवि निष्पादन की दक्षता और विश्वसनीयता को बढ़ाता है।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3