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

स्थैतिक विश्लेषण, छवि आरंभीकरण और हीप स्नैपशॉटिंग के साथ प्रदर्शन बढ़ाना

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

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

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

मूल छवि: स्टार्टअप समय और मेमोरी फ़ुटप्रिंट का अनुकूलन

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

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

विस्तृत कार्यप्रवाह

हमारे सिस्टम के लिए इनपुट जावा बाइटकोड है, जो जावा, स्काला या कोटलिन जैसी भाषाओं से उत्पन्न हो सकता है। यह प्रक्रिया एक ऑपरेटिंग सिस्टम और आर्किटेक्चर के लिए विशिष्ट मूल निष्पादन योग्य उत्पादन करने के लिए एप्लिकेशन, उसके पुस्तकालयों, जेडीके और वीएम घटकों को समान रूप से व्यवहार करती है - जिसे "मूल छवि" कहा जाता है। निर्माण प्रक्रिया में एक निश्चित बिंदु तक पहुंचने तक पुनरावृत्त बिंदुओं का विश्लेषण और हीप स्नैपशॉटिंग शामिल होती है, जिससे एप्लिकेशन को पंजीकृत कॉलबैक के माध्यम से सक्रिय रूप से भाग लेने की अनुमति मिलती है। इन चरणों को सामूहिक रूप से मूल छवि निर्माण प्रक्रिया के रूप में जाना जाता है (चित्र 1)

Enhancing Performance with Static Analysis, Image Initialization and Heap Snapshotting

चित्रा 1 - मूल छवि निर्माण प्रक्रिया(स्रोत: redhat.com)

विश्लेषण के बिंदु

हम रनटाइम के दौरान कक्षाओं, विधियों और क्षेत्रों की पहुंच का पता लगाने के लिए पॉइंट-टू विश्लेषण का उपयोग करते हैं। पॉइंट-टू विश्लेषण सभी प्रवेश बिंदुओं से शुरू होता है, जैसे कि एप्लिकेशन की मुख्य विधि, और एक निश्चित बिंदु तक पहुंचने तक सभी परिवर्तनीय रूप से पहुंच योग्य तरीकों को पुनरावृत्त रूप से पार करता है (चित्र 2)।

Enhancing Performance with Static Analysis, Image Initialization and Heap Snapshotting

चित्रा 2 - विश्लेषण के बिंदु

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

इनिशियलाइज़ेशन कोड चलाएँ

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

  1. क्लास इनिशियलाइज़र: प्रत्येक जावा क्लास में विधि द्वारा इंगित एक क्लास इनिशियलाइज़र हो सकता है, जो स्थिर फ़ील्ड को इनिशियलाइज़ करता है। डेवलपर्स चुन सकते हैं कि बिल्ड-टाइम बनाम रनटाइम पर कौन सी कक्षाएं प्रारंभ की जाएं।

  2. स्पष्ट कॉलबैक: डेवलपर्स हमारे सिस्टम द्वारा प्रदान किए गए हुक के माध्यम से कस्टम कोड लागू कर सकते हैं, विश्लेषण चरणों से पहले, दौरान या बाद में निष्पादित कर सकते हैं।

यहां हमारे सिस्टम के साथ एकीकरण के लिए एपीआई प्रदान की गई हैं।

निष्क्रिय एपीआई (वर्तमान विश्लेषण स्थिति पर सवाल उठाता है)

boolean isReachable(Class> clazz);

boolean isReachable(Field field);

boolean isReachable(Executable method);

अधिक जानकारी के लिए, QueryReachabilityAccess देखें

सक्रिय एपीआई (विश्लेषण स्थिति परिवर्तन के लिए कॉलबैक पंजीकृत करता है):

void registerReachabilityHandler(Consumer callback, 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

संक्षेप में, हीप स्नैपशॉटिंग एल्गोरिदम कुशलतापूर्वक पहुंच योग्य वस्तुओं और उनके क्षेत्रों को व्यवस्थित रूप से पार करके हीप का एक स्नैपशॉट बनाता है। यह सुनिश्चित करता है कि छवि ढेर में केवल प्रासंगिक ऑब्जेक्ट शामिल हैं, जो मूल छवि के प्रदर्शन और मेमोरी फ़ुटप्रिंट को अनुकूलित करता है।

निष्कर्ष

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

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

कुल मिलाकर, हीप स्नैपशॉटिंग यह सुनिश्चित करके मूल छवियों के प्रदर्शन और मेमोरी उपयोग को अनुकूलित करता है कि छवि हीप में केवल आवश्यक ऑब्जेक्ट शामिल हैं। यह व्यवस्थित दृष्टिकोण मूल छवि निष्पादन की दक्षता और विश्वसनीयता को बढ़ाता है।

विज्ञप्ति वक्तव्य यह लेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/yanev/enhancing-performance-with-static-analyss-image-initialization-and-heap-snapshotting-263f?1 यदि कोई उल्लंघन है, तो कृपया स्टडी_गोलंग@163 से संपर्क करें इसे हटाने के लिए .com
नवीनतम ट्यूटोरियल अधिक>

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

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

Copyright© 2022 湘ICP备2022001581号-3