जेवीएम में बाइटकोड कैसे सत्यापित किया जाता है?जेवीएम में बाइटकोड कैसे सत्यापित किया जाता है?
उत्तर
ओरेकल खुद को यह कैसे काम करता है here पर एक छोटे से टुकड़ा पृष्ठ है।
असल में, जेआरई जेडीके पर भरोसा नहीं करता है। ऐसा इसलिए है क्योंकि इसका कोई ज्ञान नहीं है कि जेडीके कंपाइलर ने क्लास फ़ाइल बनाई है। यह क्लास फ़ाइल को सत्यापित होने तक शत्रुतापूर्ण मानता है।
उस पर विस्तार, बाइटकोड सत्यापन एक "विरोधी संकलक" कहने वाले सूर्य से बचाने के लिए एक आवश्यक कदम है। सूर्य का अपना जावा कंपाइलर यह सुनिश्चित करता है कि जावा स्रोत कोड सुरक्षा नियमों का उल्लंघन नहीं करता है, लेकिन जब कोई एप्लिकेशन कोड खंड आयात करता है, तो वास्तव में पता नहीं है यदि कोड खंड सुरक्षा के लिए जावा भाषा नियमों का पालन करता है। दूसरे शब्दों में, कोड भरोसेमंद जावा कंपाइलर द्वारा उत्पादित नहीं किया जा सकता है।
उस स्थिति में, आपकी मशीन पर जावा रन टाइम सिस्टम को यह मानना है कि टुकड़ा खराब है और इसे बाइटकोड सत्यापन के अधीन करता है।
जावा वर्चुअल मशीन बाइटकोड नहीं देखता है जब तक कि यह सत्यापन प्रक्रिया के माध्यम से नहीं हो जाता है। इसे बाइटकोड लोड होने के रूप में करने से लाभ भी मिलता है कि कोड चलाने के हर बार चलाने के लिए बहुत सारे रन टाइम चेक की आवश्यकता नहीं होती है।चूंकि इसे सही के रूप में सत्यापित किया गया है, यह एक बार चलने के बाद, तेजी से चला सकता है, अन्यथा संभव होगा।
जुड़ा हुआ चित्र का एक गायन के नीचे है:
<<<=== Unsafe/Safe ===>>>
\
+---------------+ +-------------------+
| Java source | +--> | Class loader | --+
+---------------+ | | Bytecode verifier | |
| | +-------------------+ |
V | / |
+---------------+ | \ V
| Java compiler | Network / +-------------------+
+---------------+ | \ | JVM/JIT |
| | / +-------------------+
V | \ |
+---------------+ | / V
| Java bytecode | --+ \ +-------------------+
+---------------+ / | Operating system |
\ +-------------------+
/ |
\ V
/ +-------------------+
\ | Hardware |
/ +-------------------+
\
<<<=== Unsafe/Safe ===>>>
जानकारी का सबसे अच्छा स्रोत शायद JVM विनिर्देश, 4.10 Verification of class Files में प्रासंगिक अनुभाग है।
को लिंक-टाइम सत्यापन दुभाषिया के प्रदर्शन को बढ़ाता है:
जानकारी के लिए लिंक है, लेकिन मोटे तौर पर देखें। महंगे चेक जो प्रत्येक व्याख्या किए गए निर्देश के लिए रन टाइम पर बाधाओं को सत्यापित करने के लिए अन्यथा निष्पादित किए जाने चाहिए, को समाप्त किया जा सकता है। जावा वर्चुअल मशीन यह मान सकती है कि ये चेक पहले से ही किए जा चुके हैं। उदाहरण के लिए, जावा वर्चुअल मशीन पहले से ही निम्न को जान लेगी:
- कोई ऑपरेंड स्टैक ओवरफ़्लो या अंडरफ्लो नहीं हैं।
- सभी स्थानीय चर उपयोग और स्टोर मान्य हैं।
- सभी जावा वर्चुअल मशीन निर्देशों के लिए तर्क वैध प्रकार के हैं।
सत्यापनकर्ता भी सत्यापन करता है जिसे कोड विशेषता (§4.7.3) के कोड सरणी को देखे बिना किया जा सकता है। किए गए चेक में निम्न शामिल हैं:
- यह सुनिश्चित करना कि अंतिम कक्षाएं उप-वर्गीकृत नहीं हैं और अंतिम विधियां ओवरराइड नहीं हैं (§5.4.5)।
- यह जांचकर कि प्रत्येक वर्ग (
Object
को छोड़कर) में प्रत्यक्ष सुपरक्लास है।- यह सुनिश्चित करना कि निरंतर पूल दस्तावेजबद्ध स्थिर बाधाओं को पूरा करता है; उदाहरण के लिए, निरंतर पूल में प्रत्येक
CONSTANT_Class_info
संरचना मेंname_index
आइटमCONSTANT_Utf8_info
संरचना के लिए एक वैध निरंतर पूल इंडेक्स है।- जांच कर रहा है कि निरंतर पूल में सभी फ़ील्ड संदर्भ और विधि संदर्भों में वैध नाम, वैध कक्षाएं और वैध प्रकार वर्णनकर्ता हैं।
में कुछ अस्पष्ट कोने मामलों में जहां विनिर्देश अस्पष्ट या एकमुश्त हॉटस्पॉट वी एम का उल्लंघन है कर रहे हैं। यदि आप निश्चित हैं कि आपके बाइटकोड को सत्यापित करना चाहिए और यह नहीं पता कि यह क्यों नहीं है, तो आप ओपनजेडीके स्रोत भंडार को भी देख सकते हैं। – Antimony
हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/10765467) –
@ एंड्रेफ्राटेलि: और वास्तव में यह कोई जवाब नहीं है जिसे मैं अभी जोड़ूंगा (ध्यान दें कि यह लगभग 7 साल पुराना है ...)। यह एक प्रश्न नहीं है जिसे मैं * उत्तर * चाहता हूं, इसके बजाय इसे बहुत व्यापक रूप से बंद कर रहा हूं। मैंने यहां * कुछ * विवरण जोड़े हैं, लेकिन यदि लिंक दोबारा टूट जाता है (इसे आज दो बार तय किया गया था, अलग-अलग तरीकों से) यह अभी भी बहुत उपयोगी नहीं होगा। साथ ही, जब प्रश्न स्वयं ही अनदेखा रहता है, मुझे लगता है कि यह एक उपयोगी उत्तर है ... –
- 1. जेवीएम बाइटकोड में एनओपी क्या है?
- 2. ऑब्जेक्ट.गेटहाशकोड() सीएलआर और जेवीएम में कैसे कार्यान्वित किया जाता है?
- 3. जेवीएम पर स्कैला बाइटकोड कैसे चलाएं?
- 4. जेवीएम बाइटकोड सत्यापनकर्ता की जिम्मेदारियां
- 5. मैं जेवीएम असेंबली कोड को बाइटकोड में कैसे संकलित करूं?
- 6. हॉटस्पॉट जेवीएम बाइटकोड इंटरप्रेटर एक ट्रेसिंग जेआईटी है?
- 7. एक जेवीएम निर्देश क्या है?
- 8. एक यूनरी नहीं अभिव्यक्ति के लिए जेवीएम बाइटकोड उत्पन्न करना
- 9. जावा बाइटकोड "अत्यधिक" संख्या को "खराब" कोड माना जाता है?
- 10. जावा में स्ट्रिंग को कैसे सत्यापित किया जा सकता है?
- 11. बाइटकोड
- 12. जावा बाइटकोड
- 13. कैसे ConcurrentDictionary का उपयोग किया जाता है और इसे क्रमबद्ध कैसे किया जाता है?
- 14. समूहमै ने अपना नंबर कैसे सत्यापित किया?
- 15. क्या सी @+ में '@' प्रयोग किया जाता है?
- 16. ईमेल प्रेषक पता कैसे सत्यापित करें सत्यापित नहीं किया गया है?
- 17. obcomuscated जावा बाइटकोड decpiling
- 18. ASP.NET मल्टीथ्रेड कैसे किया जाता है?
- 19. std :: tuple कैसे कार्यान्वित किया जाता है?
- 20. लेआउट का उपयोग कैसे किया जाता है?
- 21. ओपनआईडी कैसे कार्यान्वित किया जाता है?
- 22. बिगडिसीमल कैसे कार्यान्वित किया जाता है?
- 23. प्रोसेस आकार कैसे निर्धारित किया जाता है?
- 24. एसएमपी पर हस्तक्षेप कैसे किया जाता है?
- 25. "कॉन्स्ट" कैसे कार्यान्वित किया जाता है?
- 26. लेक्सिकल स्कोपिंग कैसे कार्यान्वित किया जाता है?
- 27. ImmutableObjectAttribute का उपयोग कैसे किया जाता है?
- 28. jQuery इंतजार किया जाता है
- 29. एप्लिकेशन वर्चुअलाइजेशन कैसे कार्यान्वित किया जाता है?
- 30. ग्रुप द्वारा काम कैसे किया जाता है?
+1 समीक्षा के लिए ध्वजांकित किया गया था :) – dfa
समस्या केवल दुर्भावनापूर्ण कंपाइलर नहीं है। अगर कोई वास्तव में शोषण लिखने की कोशिश कर रहा है, तो संभवतः वे बाइटकोड हाथ से, या कम से कम महत्वपूर्ण भाग लिखेंगे। – Antimony
लेकिन स्थानीय क्लासस्पैट से लोड की गई कक्षाओं के लिए सत्यापनकर्ता सक्षम नहीं है (या निष्पादित)? –