जावा वर्चुअल मशीन

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

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

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

जावा प्लेटफॉर्म, मानक संस्करण (जे2एसइ) 5.0 के साथ आरम्भ करते हुए, जेवीएम विनिर्देशन में परिवर्तन जेएसआर 924 के रूप में जावा सामुदायिक प्रक्रिया के अन्तर्गत विकसित किए गए हैं।, वर्ग के लिए प्रस्तावित परिवर्तनों का समर्थन करने के लिए विनिर्देशन में परिवर्तन (फ़ाइल स्वरूप) (जेएसआर 202) जेएसआर 924 के रख-रखाव रिलीज़ के रूप में किया जा रहा है। जेवीएम के लिए विनिर्देश ब्लू बुक के रूप में प्रकाशित किया गया था, यह प्रस्तावना में कहा गया है:

"हमारा मानना है कि इस विनिर्देश को जावा वर्चुअल मशीन को पर्याप्त रूप से प्रतिलेखित करना चाहिए ताकि संभावित संगत क्लीन-रूम कार्यान्वयन संभव हो सके। ओरेकल परीक्षण प्रदान करता है जो जावा आभासी मशीन के कार्यान्वयन के उचित संचालन को सत्यापित करता है।"

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

क्लास लोडर
जेवीएम बाइट कोड की संगठनात्मक इकाइयों में से एक क्लास (कंप्यूटर प्रोग्रामिंग) है। एक क्लास लोडर कार्यान्वयन जावा क्लास फ़ाइल स्वरूप के अनुरूप कुछ भी पहचानने और लोड करने में सक्षम होना चाहिए। कोई भी कार्यान्वयन वर्ग फ़ाइलों के अलावा अन्य बाइनरी रूपों को पहचानने के लिए स्वतंत्र है, लेकिन इसे कक्षा फ़ाइलों को पहचानना होगा।

क्लास लोडर इस सख्त क्रम में तीन बुनियादी गतिविधियाँ करता है:


 * 1) लोड हो रहा है: एक प्रकार के लिए बाइनरी डेटा ढूँढता है और आयात करता है
 * 2) लिंकिंग: सत्यापन, तैयारी और (वैकल्पिक रूप से) समाधान करता है
 * 3) *सत्यापन: आयातित प्रकार की शुद्धता सुनिश्चित करता है
 * 4) *तैयारी: वर्ग चर के लिए स्मृति आवंटित करता है और स्मृति को डिफ़ॉल्ट मानों में प्रारंभ करता है
 * 5) *संकल्प: प्रतीकात्मक संदर्भों को प्रकार से प्रत्यक्ष संदर्भों में परिवर्तित करता है।
 * 6) प्रबंध: जावा कोड को प्रबंध करता है, जो क्लास वेरिएबल्स को उनके उचित प्रारंभिक मानों के लिए प्रबंध करता है।

सामान्य तौर पर, तीन प्रकार के क्लास लोडर होते हैं: बूटस्ट्रैप क्लास लोडर, एक्सटेंशन क्लास लोडर और प्रणाली / एप्लिकेशन क्लास लोडर।

प्रत्येक जावा आभासी यंत्र के कार्यान्वयन में एक बूटस्ट्रैप क्लास लोडर होना चाहिए जो विश्वसनीय कक्षाओं को लोड करने में सक्षम हो, साथ ही एक एक्सटेंशन क्लास लोडर या एप्लिकेशन क्लास लोडर भी हो। जावा आभासी यंत्र विनिर्देश निर्दिष्ट नहीं करता है कि क्लास लोडर को कक्षाओं का पता कैसे लगाना चाहिए।

आभासी यंत्र स्थापत्य
जेवीएम विशिष्ट प्रकार के डेटा पर काम करता है, जैसा कि जावा आभासी यंत्र विनिर्देशों में निर्दिष्ट है। डेटा प्रकारों को विभाजित किया जा सकता है आदिम प्रकारों में (पूर्णांक, फ़्लोटिंग-पॉइंट, लंबा आदि) और संदर्भ प्रकार। पहले के जेवीएम केवल 32-बिट कंप्यूटिंग|32-बिट यंत्र थे।  और   प्रकार, जो 64-बिट कंप्यूटिंग | 64-बिट्स हैं, मूल रूप से समर्थित हैं, लेकिन फ्रेम के स्थानीय चर या ऑपरेंड स्टैक में भंडारण की दो इकाइयों का उपभोग करते हैं, क्योंकि प्रत्येक इकाई 32 बिट्स है। ,  ,  , और   प्रकार सभी साइन-विस्तारित हैं (छोड़कर   जो साइन एक्सटेंशन (zero-extended|zero-extended) है और 32-बिट पूर्णांक के रूप में संचालित होता है, जैसा कि   प्रकार। छोटे प्रकारों में लोडिंग, भंडारण और प्रकार रूपांतरण के लिए केवल कुछ प्रकार-विशिष्ट निर्देश होते हैं।   8-बिट के रूप में संचालित होता है   मान, 0 प्रतिनिधित्व के साथ   और 1 प्रतिनिधित्व करता है  . (यद्यपि   जावा आभासी यंत्र विशिष्टता के बाद से एक प्रकार के रूप में माना गया है, द्वितीय संस्करण ने इस मुद्दे को संकलित और निष्पादित कोड में स्पष्ट किया है, इसमें थोड़ा अंतर है   और ए   विधि हस्ताक्षर और बूलियन सरणियों के प्रकार में नाम मैंगलिंग # जावा को छोड़कर।  s in विधि हस्ताक्षर के रूप में उलझे हुए हैं   जबकि  एस के रूप में क्षतिग्रस्त हैं. बूलियन सरणियाँ प्रकार को ले जाती हैं  लेकिन प्रति तत्व 8 बिट्स का उपयोग करें, और जेवीएम में बूलियन्स को बिट सरणी में पैक करने की कोई अंतर्निहित क्षमता नहीं है, इसलिए वे जिस प्रकार का प्रदर्शन करते हैं और उसी के समान व्यवहार करते हैं   सरणियाँ। अन्य सभी उपयोगों में,   जेवीएम के लिए प्रकार प्रभावी रूप से अज्ञात है क्योंकि बूलियन पर काम करने के लिए सभी निर्देशों का उपयोग भी किया जाता है  एस।) हालांकि नए जेवीएम रिलीज (ओपनजेडीके हॉटस्पॉट जेवीएम) 64-बिट का समर्थन करते हैं, आपके पास 64-बिट ओएस पर 32-बिट/64-बिट जेवीएम हो सकता है। 64-बिट वातावरण में जावा चलाने का प्राथमिक लाभ बड़ा पता स्थान है। यह बहुत बड़े जावा हीप आकार और जावा थ्रेड्स की बढ़ी हुई अधिकतम संख्या की अनुमति देता है, जो कुछ प्रकार के बड़े अनुप्रयोगों के लिए आवश्यक है, यद्यपि 32-बिट जेवीएम की तुलना में 64-बिट जेवीएम का उपयोग करने में एक प्रदर्शन हिट है।

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

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

बायटेकोड निर्देश
जेवीएम में निम्नलिखित कार्यों के समूह के लिए निर्देश (कंप्यूटर विज्ञान) है:

लोड और स्टोर

अंकगणित

प्रकार रूपांतरण

वस्तु निर्माण और हेरफेर

ऑपरेंड स्टैक प्रबंधन (पुश / पॉप)

नियंत्रण हस्तांतरण (शाखा)

विधि मंगलाचरण और वापसी

अपवाद फेंकना

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

ये निर्देश आम के एक सेट पर काम करते हैं पृथक डेटा प्रकार अपितु किसी विशिष्ट निर्देश सेट स्थापत्य के मूल डेटा प्रकार।

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

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

जेवीएम निष्पादित होने से पहले सभी बायटेकोड को सत्यापित करता है। इस सत्यापन में मुख्य रूप से तीन प्रकार के चेक होते हैं:


 * शाखाएँ सदैव मान्य स्थानों पर होती हैं
 * डेटा सदैव प्रारंभ होता है और संदर्भ सदैव टाइप-सुरक्षित होते हैं
 * निजी या पैकेज निजी डेटा और विधियों तक पहुंच कठोर रूप से नियंत्रित होती है

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

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

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

जावाकार्ड उद्योग द्वारा बाइटकोड सत्यापनकर्ताओं का औपचारिक प्रमाण किया गया है (जावा कार्ड बाइट कोड के लिए एक अंतर्निहित सत्यापनकर्ता का औपचारिक विकास) )

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

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

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

जावा बाइटकोड का उद्देश्य प्लेटफ़ॉर्म-स्वतंत्र और सुरक्षित होना है। कुछ जेवीएम कार्यान्वयन में एक दुभाषिया सम्मिलित नहीं है, लेकिन इसमें केवल एक समय-समय पर संकलक सम्मिलित है।

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

डब्ल्यू3टेक के अनुसार, जावा एप्लेट और माइक्रोसॉफ्ट सिल्वरलाइट का उपयोग सभी वेब साइटों के लिए 0.1% तक गिर गया था, जबकि फ्लैश 10.8% तक गिर गया था।

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

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

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

यह भी देखें

 * सामान्य भाषा कार्यावधि
 * जावा आभासी यंत्रों की सूची
 * जेवीएम भाषाओं की सूची
 * जावा आभासी यंत्रों की तुलना
 * आवेदन आभासी यंत्रों की तुलना
 * स्वचालित अपवाद हैंडलिंग
 * जावा प्रदर्शन
 * जावा प्रोसेसर

इस पेज में लापता आंतरिक लिंक की सूची

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

संदर्भ

 * Clarifications and Amendments to the Java Virtual Machine Specification, Second Edition includes list of changes to be made to support J2SE 5.0 and JSR 45
 * JSR 45, specifies changes to the class file format to support source-level debugging of languages such as JavaServer Pages (JSP) and SQLJ that are translated to Java