2013-07-11 3 views
5

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

मैंने यह जवाब देखा: How is JIT compiled code injected in memory and executed?, लेकिन मैं उलझन में हूं कि क्यों ऑपरेटिंग सिस्टम उपयोगकर्ता प्रोग्रामों को अनुमति देगा रीड + मेमोरी क्षेत्रों को निकालें। क्या अन्य ऑपरेटिंग सिस्टम यानी लिनक्स आदि जेआईटी के काम करने के लिए कुछ समान ऑफर करते हैं?

क्या कोई मेरी समझ को स्पष्ट करने में मदद कर सकता है?

उत्तर

3

लिनक्स में, एक मेमोरी सेगमेंट को लिखने योग्य और निष्पादन योग्य (और बाद में इसकी सुरक्षा पर बदला जा सकता है) स्थापित किया जा सकता है। mmap(2) और mprotect(2) सिस्कोल देखें।

जेवीएम शायद किसी भी डिस्क फ़ाइलों का उपयोग किए बिना मेमोरी में मशीन कोड का उत्पादन करेगा। इसकी जेआईटी मशीनरी शायद निष्पादन योग्य स्मृति में बाइट्स लिखती है।

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

मुफ्त सॉफ्टवेयर (जैसे OpenJdk अंदर एक) Just-in-time compilation और HotSpot और Virtual Memory विकी पृष्ठों पढ़ें, और कुछ java प्रक्रिया आईएनजी strace कोशिश ...

कुछ JVMs हैं, तो आप अपने स्रोत कोड का अध्ययन कर सकते हैं।

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