2012-12-18 26 views
6

हाल छुआ गया है जावा classloaders और अचानक मान्यता है कि पूरी तरह से समझ में नहीं आता क्या कदम-दर-कदम होता है जब कोई कॉलजब जावा प्रोग्राम शुरू होता है तो क्या होता है?

java -jar App.jar 

खैर मुझे लगता है कि

  1. JVM का एक नया उदाहरण है बनाया गया
  2. यह मुख्य वर्ग और अन्य कक्षाओं को लोड करने के लिए क्लासलोडर का उपयोग करता है
  3. बाइट-कोड मुख्य() विधि
  4. 0 से निष्पादित करने के लिए प्रारंभ किया गया है

लेकिन फिर भी मुझे लगता है कि मुझे इसके बारे में अधिक जानने की आवश्यकता है।

  • स्टार्टअप पर कौन से वर्गों को लोड किया जाना चाहिए और किसकी आवश्यकता है?

मुझे दो संबंधित प्रश्न मिल गए हैं लेकिन वहां यह समझाया नहीं गया है कि जावा वास्तविकताओं को कैसे लागू किया जाए।

What happens when a computer program runs?

What happens when you run a program?

+1

spec मदद कर सकता है (थोड़ा उलझन में अल्बेट, इसलिए एक टिप्पणी एक जवाब नहीं है): http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.1 – Charlie

+0

यह लिंक जावा वीएम स्पेक को भी संदर्भित करता है: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html#jvms-5.2 – Charlie

उत्तर

2

• कौन और कैसे निर्णय लेता है जो कक्षाओं स्टार्टअप पर लोड किया जाना चाहिए और जो एक बार की जरूरत?

हमें जावा क्लास लोडिंग के मूलभूत सिद्धांतों को समझने की आवश्यकता है। प्रारंभ में बूटस्ट्रैप क्लासलोडर (इसे स्वयं वीएम के हिस्से के रूप में लागू किया जाता है) कोर सिस्टम कक्षाओं को लोड करने के लिए ज़िम्मेदार है। फिर अन्य वर्ग लोडर भी विस्तार, सिस्टम, उपयोगकर्ता परिभाषित (वैकल्पिक) वर्ग लोडर हैं जो तय करते हैं कि कक्षा कब और कैसे लोड की जानी चाहिए। Fundamentals of class loading

1

निर्णय क्लासलोडर द्वारा किया गया है। अलग-अलग कार्यान्वयन होते हैं, जिनमें से कुछ वे सभी वर्गों को प्री-लोड करते हैं और कुछ केवल कक्षाओं को लोड करते हैं क्योंकि उनकी आवश्यकता होती है।

एक कक्षा केवल को की आवश्यकता होती है जब इसे पहली बार प्रोग्राम कोड से एक्सेस किया जाता है; यह एक्सेस उस वर्ग से किसी ऑब्जेक्ट का तात्कालिकता हो सकती है या इसके static सदस्यों में से एक तक पहुंच सकती है। आम तौर पर, जब आवश्यक हो तो डिफ़ॉल्ट क्लासलोडर कक्षाओं को आलसी लोड करेगा।

कुछ वर्गों को किसी भी मामले में प्री-लोड होने पर भरोसा नहीं किया जा सकता है: Class.forName(...) के माध्यम से प्राप्त कक्षाओं को तब तक निर्धारित नहीं किया जा सकता जब तक कि यह कोड वास्तव में निष्कर्ष निकाला न जाए।

सरल प्रयोगों के लिए, अन्य विकल्पों के अलावा, आप वास्तविक प्रारंभिक आदेश कोड का उपयोग वास्तविक समय और क्रम को देखने के लिए कर सकते हैं जिसमें कक्षाएं वास्तव में लोड की जाती हैं; कक्षा को पहली बार लोड होने पर यह कोड निष्पादित किया जाएगा; उदाहरण:

class SomeClass { 

    static { 
     System.out.println("Class SomeClass was initialized."); 
    } 

    public SomeClass() { 
     ... 
    } 

    ... 

} 
0

आपका उदाहरण एक निष्पादन योग्य जार, जो केवल एक सामान्य जावा संग्रह (जार) एक अतिरिक्त कुंजी/मान जोड़ी के साथ है यह मैनिफ़ेस्ट फ़ाइल (फ़ोल्डर "META_INF" में स्थित) है में पता चलता है।कुंजी "Main-Class" है और उस वर्ग के पूर्ण योग्यता वाले वर्ग का मूल्य जिसका "मुख्य" विधि निष्पादित किया जाएगा, यदि आप अपने उदाहरण की तरह जार चलाते हैं।

एक जार एक ज़िप फ़ाइल है और आप प्रत्येक ज़िप संग्रह उपकरण के साथ एक नज़र देख सकते हैं।

0

जब भी आप एक जावा प्रोग्राम निम्न चरणों के संकलन जगह

  1. प्रथम श्रेणी लोडर JVM में वर्ग को लोड करता है लेता है।
  2. आदेश javac filename.java संकलन समय त्रुटियों के लिए संकलक चेकों देने के बाद और अगर सब कुछ ठीक है तो यह .class फ़ाइलें (बाइट कोड) उत्पन्न होगा।

यह पहला चरण होगा।

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

जावा में पहला चरण जेआईटी कंपाइलर (बस समय में) द्वारा किया जाता है।

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