java - स्टैक मैप फ्रेम क्या है




jvm bytecode stackframe (2)

मैं हाल ही में जावा वर्चुअल मशीन स्पेसिफिकेशन्स (JVMS) को देखने की कोशिश कर रहा हूं ताकि यह समझने की कोशिश की जा सके कि मेरे प्रोग्राम क्या काम करते हैं, लेकिन मुझे एक सेक्शन मिला है, जो मुझे काफी पसंद नहीं आ रहा है ...

धारा ४.२.४ में StackMapTable विशेषता का वर्णन है, और उस खंड में दस्तावेज़ स्टैक मैप फ़्रेम के बारे में विवरण में जाता है। मुद्दा यह है कि यह थोड़ा चिंताजनक है और मैं उदाहरण के साथ सबसे अच्छा सीखता हूं; पढ़कर नहीं।

मैं समझता हूं कि पहला स्टैक मैप फ़्रेम विधि डिस्क्रिप्टर से लिया गया है, लेकिन मुझे समझ में नहीं आता है कि कैसे (जो माना जाता है कि here समझाया गया here ।) इसके अलावा, मैं पूरी तरह से यह नहीं समझता कि स्टैक मैप फ़्रेम क्या करते हैं। मुझे लगता है कि वे जावा में ब्लॉक के समान हैं, लेकिन ऐसा प्रतीत होता है जैसे कि आप एक दूसरे के अंदर नक्शा फ्रेम नहीं कर सकते।

वैसे भी, मेरे पास दो विशिष्ट प्रश्न हैं:

  • स्टैक मैप फ़्रेम क्या करते हैं?
  • पहला स्टैक मैप फ्रेम कैसे बनाया जाता है?

और एक सामान्य प्रश्न:

  • क्या कोई जेवीएमएस में दिए गए विवरण की तुलना में व्याख्या को कम चिंताजनक और समझने में आसान प्रदान कर सकता है?

Answers

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

अन्य बातों के अलावा, बायोटेक सत्यापन यह सुनिश्चित करता है कि निर्देश अच्छी तरह से बने हैं, कि सभी जंप विधि के भीतर वैध निर्देश हैं, और यह कि सभी निर्देश सही प्रकार के मूल्यों पर काम करते हैं। अंतिम वह जगह है जहाँ स्टैक मैप में आता है।

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

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

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

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

प्रत्येक स्थिति जहां प्रकार स्पष्ट रूप से सूचीबद्ध होते हैं उन्हें स्टैक मैप फ़्रेम के रूप में जाना जाता है। StackMapTable विशेषता में क्रम में फ़्रेमों की एक सूची होती है, हालांकि डेटा आकार को कम करने के लिए उन्हें आमतौर पर पिछले फ्रेम से अंतर के रूप में व्यक्त किया जाता है। यदि विधि में कोई फ्रेम नहीं है, जो तब होता है जब नियंत्रण प्रवाह कभी नहीं जुड़ता है (यानी सीएफजी एक पेड़ है), तो स्टैकपाउज़टेबल विशेषता को पूरी तरह से छोड़ा जा सकता है।

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

यदि आप जावा के लिए उपयोग किए जाते हैं, तो कुछ मामूली अंतर हैं कि कैसे विधि पैरामीटर प्रकार बाइटकोड स्तर पर काम करते हैं। सबसे पहले, वर्चुअल मेथड में पहले पैरामीटर के रूप में this निहितार्थ होता है। दूसरा, boolean , byte , char और short बायटेकोड स्तर पर मौजूद नहीं हैं। इसके बजाय, उन्हें पर्दे के पीछे सभी को लागू किया जाता है।


जावा दस्तावेज page

java.lang.reflect पैकेज कक्षाओं और वस्तुओं के बारे में प्रतिबिंबित जानकारी प्राप्त करने के लिए कक्षाएं और इंटरफेस प्रदान करता है। प्रतिबिंब सुरक्षा प्रतिबंधों के भीतर, अंतर्निहित समकक्षों पर काम करने के लिए लोड किए गए वर्गों के क्षेत्रों, विधियों और रचनाकारों, और परावर्तित क्षेत्रों, विधियों और रचनाकारों के उपयोग के बारे में जानकारी तक प्रोग्रामेटिक पहुंच की अनुमति देता है।

AccessibleObject यदि आवश्यक ReflectPermission उपलब्ध है तो एक्सेस चेक के दमन की अनुमति देता है।

java.lang.Class के साथ इस पैकेज में कक्षाएं java.lang.Class , दुभाषिया, ऑब्जेक्ट इंस्पेक्टर, क्लास ब्राउज़र, और Object Serialization और JavaBeans जैसी सेवाओं को समायोजित करती हैं जिन्हें लक्षित ऑब्जेक्ट के सार्वजनिक सदस्यों तक पहुंच की आवश्यकता होती है (इसके आधार पर रनटाइम क्लास) या किसी दिए गए वर्ग द्वारा घोषित सदस्यों

इसमें निम्नलिखित कार्यक्षमता शामिल है।

  1. कक्षा वस्तुओं को प्राप्त करना,
  2. एक वर्ग (फ़ील्ड, विधियों, रचनाकारों) की गुणों की जांच करना,
  3. फील्ड वैल्यू सेट करना और प्राप्त करना,
  4. विधियों का आह्वान,
  5. वस्तुओं के नए उदाहरण बनाना।

Class कक्षा द्वारा प्रकट विधियों के लिए इस documentation लिंक पर नज़र डालें।

इस article (डेनिस सोस्नोस्की, राष्ट्रपति, सोस्नोस्की सॉफ्टवेयर सॉल्यूशंस, इंक द्वारा) और यह article (सुरक्षा-खोज पीडीएफ):

मैं प्रतिबिंब का उपयोग करने के उपयोग से काफी कमी देख सकता हूं

प्रतिबिंब का उपयोगकर्ता:

  1. यह प्रोग्राम घटकों को गतिशील रूप से जोड़ने का बहुत बहुमुखी तरीका प्रदान करता है
  2. यह पुस्तकालयों के निर्माण के लिए उपयोगी है जो वस्तुओं के साथ बहुत सामान्य तरीकों से काम करते हैं

प्रतिबिंब की कमी:

  1. क्षेत्र और विधि पहुंच के लिए उपयोग किए जाने पर प्रतिबिंब प्रत्यक्ष कोड से बहुत धीमा है।
  2. यह आपके कोड के अंदर वास्तव में क्या चल रहा है अस्पष्ट कर सकते हैं
  3. यह स्रोत कोड को छोड़ देता है रखरखाव की समस्याएं बना सकता है
  4. प्रतिबिंब कोड इसी प्रत्यक्ष कोड से भी अधिक जटिल है
  5. यह डेटा एक्सेस सुरक्षा और प्रकार की सुरक्षा जैसी प्रमुख जावा सुरक्षा बाधाओं का उल्लंघन करने की अनुमति देता है

सामान्य दुरुपयोग:

  1. प्रतिबंधित कक्षाओं की लोडिंग,
  2. एक प्रतिबंधित वर्ग के रचनाकारों, विधियों या क्षेत्रों के संदर्भ प्राप्त करना,
  3. नए ऑब्जेक्ट इंस्टेंस, विधियों का आविष्कार, प्रतिबंधित वर्ग के फ़ील्ड मान प्राप्त करना या सेट करना।

प्रतिबिंब सुविधा के दुरुपयोग के संबंध में इस एसई प्रश्न पर एक नज़र डालें:

मैं जावा में एक निजी क्षेत्र कैसे पढ़ूं?

सारांश:

सिस्टम कोड के भीतर से किए गए अपने कार्यों के असुरक्षित उपयोग से जावा सुरक्षा मोड एल के समझौता आसानी से हो सकता हैतो इस सुविधा का उपयोग कम से कम करें





java jvm bytecode stackframe