2009-04-16 11 views

उत्तर

19

ओरेकल खुद को यह कैसे काम करता है 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 ===>>> 
+2

+1 समीक्षा के लिए ध्वजांकित किया गया था :) – dfa

+0

समस्या केवल दुर्भावनापूर्ण कंपाइलर नहीं है। अगर कोई वास्तव में शोषण लिखने की कोशिश कर रहा है, तो संभवतः वे बाइटकोड हाथ से, या कम से कम महत्वपूर्ण भाग लिखेंगे। – Antimony

+0

लेकिन स्थानीय क्लासस्पैट से लोड की गई कक्षाओं के लिए सत्यापनकर्ता सक्षम नहीं है (या निष्पादित)? –

9

जानकारी का सबसे अच्छा स्रोत शायद JVM विनिर्देश, 4.10 Verification of class Files में प्रासंगिक अनुभाग है।

को लिंक-टाइम सत्यापन दुभाषिया के प्रदर्शन को बढ़ाता है:

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

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

सत्यापनकर्ता भी सत्यापन करता है जिसे कोड विशेषता (§4.7.3) के कोड सरणी को देखे बिना किया जा सकता है। किए गए चेक में निम्न शामिल हैं:

  • यह सुनिश्चित करना कि अंतिम कक्षाएं उप-वर्गीकृत नहीं हैं और अंतिम विधियां ओवरराइड नहीं हैं (§5.4.5)।
  • यह जांचकर कि प्रत्येक वर्ग (Object को छोड़कर) में प्रत्यक्ष सुपरक्लास है।
  • यह सुनिश्चित करना कि निरंतर पूल दस्तावेजबद्ध स्थिर बाधाओं को पूरा करता है; उदाहरण के लिए, निरंतर पूल में प्रत्येक CONSTANT_Class_info संरचना में name_index आइटम CONSTANT_Utf8_info संरचना के लिए एक वैध निरंतर पूल इंडेक्स है।
  • जांच कर रहा है कि निरंतर पूल में सभी फ़ील्ड संदर्भ और विधि संदर्भों में वैध नाम, वैध कक्षाएं और वैध प्रकार वर्णनकर्ता हैं।
+0

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

+0

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/10765467) –

+0

@ एंड्रेफ्राटेलि: और वास्तव में यह कोई जवाब नहीं है जिसे मैं अभी जोड़ूंगा (ध्यान दें कि यह लगभग 7 साल पुराना है ...)। यह एक प्रश्न नहीं है जिसे मैं * उत्तर * चाहता हूं, इसके बजाय इसे बहुत व्यापक रूप से बंद कर रहा हूं। मैंने यहां * कुछ * विवरण जोड़े हैं, लेकिन यदि लिंक दोबारा टूट जाता है (इसे आज दो बार तय किया गया था, अलग-अलग तरीकों से) यह अभी भी बहुत उपयोगी नहीं होगा। साथ ही, जब प्रश्न स्वयं ही अनदेखा रहता है, मुझे लगता है कि यह एक उपयोगी उत्तर है ... –

संबंधित मुद्दे