साक्षात्कार प्रश्न 005-Java-JVM (भाग 1)
2024-07-12
한어 Русский язык English Français Indonesian Sanskrit 日本語 Deutsch Português Ελληνικά español Italiano Suomalainen Latina
साक्षात्कार प्रश्न 005-Java-JVM (भाग 1)
आत्मपरीक्षणप्रश्ना
प्रश्नोत्तरम्
1. JVM केषु भागेषु भवति ?
उत्तरम् : JVM एकः कार्यान्वयनीयः अस्तिबाइटकोड् इति (.class) file virtual computer, यत् स्मृतिप्रबन्धनं, कचरासंग्रहणं इत्यादीनि तन्त्राणि अपि प्रदाति । अस्मिन् निम्नलिखितमुख्यभागाः सन्ति ।
वर्ग लोडिंग् उपतन्त्रम् : JVM मध्ये बाइटकोड् सञ्चिकाः (.class) लोड् कर्तुं उत्तरदायी । Runtime data area: निष्पादनस्य समये JVM द्वारा उपयुज्यमानः स्मृतिक्षेत्रः अस्ति । निष्पादन-इञ्जिनम् : प्रोसेसर-निष्पादनार्थं बाइटकोड्-इत्यस्य यन्त्रसङ्केते व्याख्यानं वा संकलनं वा कर्तुं उत्तरदायी । देशी पुस्तकालयस्य अन्तरफलकम् : प्रचालनतन्त्रे अन्यभाषायां वा लिखितानां देशीयपुस्तकालयानां आह्वानार्थं एपिआइ-समूहं प्रदाति ।
2. रनटाइम् डाटा क्षेत्रे के क्षेत्राणि समाविष्टानि सन्ति?
उत्तरम् : रनटाइम् डाटा एरिया जावा प्रोग्राम् निष्पादयति समये JVM द्वारा आवंटितं स्मृतिक्षेत्रम् अस्ति ।
प्रोग्राम काउण्टर् : इदं लघु स्मृतिस्थानं भवति तथा च वर्तमानकाले थ्रेड् द्वारा निष्पादितस्य बाइटकोड् निर्देशस्य पता अस्ति । यदि थ्रेड् नेटिव मेथड् निष्पादयति तर्हि अस्य गणकस्य मूल्यं अनिर्धारितं भवति । जावा वर्चुअल् मशीन स्टैक् : प्रत्येकं थ्रेड् निर्मितस्य समये वर्चुअल् मशीन् स्टैक् निर्मास्यति, यस्य उपयोगः थ्रेड् इत्यस्य स्थानीयचरसारणी, ऑपरेण्ड् फ्रेम, डायनामिक लिङ्क्, मेथड् निर्गमनसूचना इत्यादीनां संग्रहणार्थं भवति जावा वर्चुअल् मशीन् स्टैक् मध्ये बहुविधाः स्टैक् फ्रेम्स् सन्ति । Native method stack: इदं JVM द्वारा Native मेथड् चालयितुं सज्जीकृतं स्थानम् अस्ति अस्य Java virtual machine stack इत्यस्य सदृशानि कार्याणि सन्ति । Heap: प्रायः सर्वाणि वस्तुदृष्टान्तानि, सरणी च संग्रहीतुं प्रयुक्तम्, तथा च मुख्यक्षेत्रं यत्र कचरासंग्रहकः कार्यं करोति । विधिक्षेत्रम् : JVM द्वारा लोड् कृतं वर्गसूचना, स्थिरांक, स्थिरचर, जस्ट-इन्-टाइम कम्पैलर द्वारा संकलित कोड इत्यादीनां संग्रहणार्थं प्रयुक्तम् । JDK1.8 इत्यस्मात् पूर्वं स्थायी पीढीरूपेण कार्यान्वितम् आसीत् । JDK1.8 तः आरभ्य स्थायिजन्मस्य स्थाने मूलस्थानं भवति । मेटास्पेस् इत्यनेन ढेरस्मृतेः अपेक्षया स्थानीयस्मृतिः उपयुज्यते ।
3. क्रमशः स्टैक् तथा हेप् इत्यत्र किं किं दत्तांशं संगृहीतं भवति?
उत्तरम् : स्टैक् (Java virtual machine stack) मध्ये संगृहीतं आँकडा:
स्थानीयचरसारणी : मुख्यतया विधिमापदण्डानां तथा स्थानीयचरानाम् संग्रहणार्थं उपयोगः भवति Data प्रकारेषु मूलभूतदत्तांशप्रकाराः वस्तुसन्दर्भाः च सन्ति । Operand stack: विधिनिष्पादनस्य समये अस्थायीरूपेण संचालननिर्देशान् मध्यवर्तीपरिणामान् च संग्रहीतुं उपयुज्यते । Dynamic link: यस्य वर्गस्य नित्यपूलस्य सन्दर्भः यस्य मेथड् अन्तर्भवति, यस्य उपयोगः मेथड् मध्ये चिह्नसन्दर्भाणां समाधानार्थं भवति । Method return address: मेथड् कॉल् इत्यस्य अनन्तरं निष्पादितस्य अग्रिमस्य निर्देशस्य पतां संग्रहयति । राशे संगृहीतदत्तांशः : १. Object instance: प्रोग्रामे नूतनस्य कीवर्डस्य माध्यमेन निर्मितः object instance, यत्र object इत्यस्य गुणाः, मेथड्स् च सन्ति । Array: सर्वेषां प्रकाराणां सरणी, मूलप्रकारसरणयः, वस्तुसरणयः च सन्ति ।
4. स्थायी पीढी (PermGen) इत्यस्य स्थाने मेटास्पेस् (MetaSpace) किमर्थं स्थापयितव्यम्?
उत्तरम् : स्थायी पीढीं मेटास्पेस् इत्यनेन प्रतिस्थापनं मुख्यतया स्थायी पीढीयाः काश्चन निहितसमस्याः सीमाश्च समाधानं कर्तुं तथा च JVM इत्यस्य कार्यक्षमतां लचीलतां च सुधारयितुम् अस्ति।
स्मृतिप्रबन्धनस्य लचीलतां कार्यक्षमतां च सुदृढं कुर्वन्तु: स्थायी-जन्मस्य स्मृति-आकारः यदा JVM आरब्धः भवति तदा सेट् भवति तथा च गतिशीलरूपेण समायोजितुं न शक्यते मेटास्पेस् जावा ढेरस्मृतेः स्थाने स्थानीयस्मृतेः उपयोगं करोति, तस्य आकारः आवश्यकतानुसारं गतिशीलरूपेण समायोजितुं शक्यते । वर्ग-अवरोहणस्य कचरा-संग्रहणस्य च समस्यायाः समाधानं कुर्वन्तु : स्थायी-पीढीयाः जीसी-व्यवहारः जटिलः अप्रत्याशितः च भवति, पुनःप्रयोगस्य दक्षता च न्यूना भवति उत्तमं प्रदर्शनं स्थिरतां च प्रदातुम् : मेटास्पेस् इत्यस्य उपयोगेन JVM स्मृतिप्रबन्धनं अधिकं एकीकृतं सुसंगतं च भवति, यतः मेटास्पेस् अन्येषां स्मृतिक्षेत्राणां इव स्थानीयस्मृतेः उपयोगेन प्रबन्ध्यते एतेन स्मृतिप्रबन्धनरणनीतयः सरलाः भवन्ति तथा च समग्रप्रदर्शने स्थिरतायां च सुधारः भवति । JVM स्मृतिप्रबन्धनं सरलीकरोतु
5. किं भवन्तः राशौ स्थानस्य मूलभूतसंरचनां अवगच्छन्ति ? केषु परिस्थितौ वस्तु पुरातनजन्मं प्रविशति ?
उत्तरम् : राशौ स्थानस्य मूलसंरचना मुख्यतया नवीनपीढी, पुरातनपीढी, स्थायी पीढी च सन्ति। JDK8 इत्यस्य अनन्तरं स्थायी जननम् मेटास्पेस् इत्यनेन प्रतिस्थापितं भवति तथा च भण्डारणार्थं स्थानीयस्मृतेः उपयोगं करोति ।
सेनोजोइक पीढी : नवीनपीढीयाः प्रगतिः एडेन् क्षेत्रे उपविभक्ता अस्ति तथा च द्वौ जीवितक्षेत्रौ (सर्वाइवर ० तथा सरवाइवर १) इति । एडेन् क्षेत्रम् : नवनिर्मितानि वस्तूनि प्रथमं एडेन् क्षेत्रे स्मृतिम् आवंटयन्ति । जीवितक्षेत्रं (S0, S1): नवीनपीढीयाः कचरासंग्रहात् जीवितानां वस्तूनाम् संग्रहणार्थं प्रयुक्तम् । प्रत्येकं Minor GC इत्यस्य अनन्तरं जीवितानि वस्तूनि एतयोः क्षेत्रयोः मध्ये आगत्य आगत्य प्रतिलिपिताः भविष्यन्ति । पुरातनपीढी : बहुविध-माइनर-जीसी-पश्चात् अद्यापि जीविताः वस्तूनि । पुरातनपीढौ कचरासंग्रहणं (Major GC or Full GC) न्यूनतया क्रियते । स्थायी जनरेशन/मेटास्पेस् : वर्गपरिभाषा, स्थिरांक, स्थिरचर, जस्ट-इन्-टाइम संकलित कोड इत्यादयः समाविष्टाः वर्गानां मेटाडाटा संग्रहणार्थं प्रयुक्ताः ।
यदा वस्तु पुरातनजन्मनि भवति तदा स्थितिः : १.
आयुः सीमा प्राप्ता भवति: प्रत्येकस्य वस्तुनः आयुः भवति यदा नूतनपीढौ स्मृतिः आवंटिता भवति, तथा च प्रत्येकस्य लघु-जीसी-पश्चात् आयुः १ वर्धितः भविष्यति यदा आयुः कस्मिंश्चित् सीमां प्राप्नोति (पूर्वनिर्धारितं १५) तदा वस्तु पुरातनपीढीं प्रति प्रचारिता भविष्यति । बृहत् वस्तु : यदि वस्तु अतीव विशालं भवति तथा च JVM द्वारा निर्धारितं सीमां अतिक्रमति तर्हि वस्तु प्रत्यक्षतया पुरातनपीढौ स्थानं आवंटयिष्यति । सरवाइवर क्षेत्रे अपर्याप्तं स्थानं : यदि सरवाइवर क्षेत्रे माइनर जीसी इत्यस्य समये सर्वाणि जीवितवस्तूनि स्थापयितुं पर्याप्तं स्थानं नास्ति तर्हि एतानि वस्तूनि भविष्यन्ति गतिशीलवस्तुवयोनिर्धारणम् : यदि सरवाइवर-अन्तरिक्षे समानवयसः सर्वेषां वस्तूनाम् आकारः सरवाइवर-अन्तरिक्षस्य अर्धभागात् अधिकः भवति तर्हि येषां वस्तूनाम् आयुः अस्मात् युगात् अधिकं वा समं वा भवति ते प्रत्यक्षतया पुरातन-पीढीयां प्रवेशं कर्तुं शक्नुवन्ति
uint ageTable:: compute_tenuring_threshold ( size_t survivor_capacity) {
size_t desired_survivor_size = ( size_t ) ( ( ( ( double ) survivor_capacity) * TargetSurvivorRatio) / 100 ) ;
size_t total = 0 ;
uint age = 1 ;
while ( age < table_size) {
total += sizes[ age] ;
if ( total > desired_survivor_size) break ;
age++ ;
}
uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold;
. . .
}
6. कस्मिन् स्मृतिक्षेत्रे बृहत्वस्तूनि स्थापितानि सन्ति ?
उत्तरम् : बृहत् वस्तुनि (अतिबृहत् सरणीः स्ट्रिंग् च) प्रायः पुरातनपीढीस्मृतिक्षेत्रे प्रत्यक्षतया आवंटिताः भवन्ति ।एतत् नूतनपीढीयाः नित्यं प्रदर्शनं न कर्तुं भवतिकचरा संग्रहण अस्मिन् समये एडेन्-क्षेत्रस्य सरवाइवर-क्षेत्रस्य च मध्ये बृहत्-वस्तूनाम् बहुधा प्रतिलिपिः भवति, तस्मात् कचरा-संग्रहण-दक्षतायां सुधारः भवति । बृहत्वस्तूनाम् प्रत्यक्षतया पुरातनपीढीयां प्रवेशार्थं दहलीजं विन्यस्यताम्:
# 将大于1MB的对象直接分配在老年代
java -XX:PretenureSizeThreshold=1m -jar your-application.jar
7. जावा-वस्तूनाम् निर्माणप्रक्रिया का भवति ?
उत्तरम्:
वर्ग लोडिंग चेक यदि वर्गः लोड् न कृतः, संयोजितः, आरम्भः च न कृतः तर्हि JVM प्रथमं वर्गं लोड् करिष्यति । अस्मिन् निम्नलिखितपदार्थाः समाविष्टाः सन्ति ।लोडिंग् : क्लास् लोडर् मार्गेण क्लास् सञ्चिकां पठित्वा क्लास् इत्यस्य बाइटकोड् स्मृतौ लोड् कुर्वन्तु । संयोजनम् : सत्यापनम्, सज्जीकरणं, विश्लेषणं च इति त्रयः चरणाः सन्ति । वर्गसञ्चिकानां सम्यक्त्वं सत्यापयन्तु, वर्गस्य स्थिरचराः सज्जीकृत्य स्मृतिः आवंटयन्तु, तथा च प्रतीकसन्दर्भान् प्रत्यक्षसन्दर्भेषु समाधानं कुर्वन्तु । Initialization: वर्गस्य static initialization block तथा static variables इत्यस्य initialization निष्पादयन्तु । स्मृतिविनियोगः JVM राशे नूतनानां वस्तूनाम् कृते स्मृतिम् आवंटयति । आवंटितस्मृतेः आकारः वस्तुनः संरचनायाः आधारेण निर्धारितः भवति, यत्र वस्तुशीर्षकं, उदाहरणदत्तांशः च सन्ति । JVM इत्यस्य स्मृतिविनियोगस्य मुख्यौ मार्गौ स्तः : Bump-the-pointer: यदि ढेरस्मृतिः नियमितः अस्ति तर्हि आवंटनसूचकस्य केवलं मुक्तस्मृतिक्षेत्रं प्रति निर्दिष्टं दूरं गन्तुं आवश्यकम् अस्ति । मुक्तसूची: यदि ढेरस्मृतिः अनियमिता अस्ति तर्हि JVM इत्यस्य मुक्तसूचीं निर्वाहयितुम् आवश्यकं भवति तथा च स्मृतिविनियोगे मुक्तसूचिकातः समुचितं खण्डं अन्वेष्टव्यम् । शून्यमूल्ये आरम्भं कुर्वन्तु JVM वस्तुनः सर्वाणि उदाहरणचराः तेषां पूर्वनिर्धारितमूल्येषु आरभते । यथा, संख्यात्मकप्रकारस्य चराः 0, Boolean प्रकारचराः false इति, सन्दर्भप्रकारस्य चराः null इति च आरभन्ते । वस्तुशीर्षकं सेट् कुर्वन्तु वस्तुनः स्मृतिस्थाने वस्तुशीर्षकसूचना सेट् कुर्वन्तु, यस्मिन् वस्तुनः हैशसङ्केतः, GC जनरेशन आयुः, लॉक् स्थितिध्वजः, थ्रेड् द्वारा धारितः लॉक्, पूर्वाग्रही थ्रेड् ID इत्यादयः सन्ति कन्स्ट्रक्टर इनिशियलाइजेशन वस्तुनः आरम्भीकरणं पूर्णं कर्तुं वस्तुनः निर्मातारं आह्वयन्तु । अस्मिन् दृष्टान्तचरयोः स्पष्टप्रारम्भक्रियाः करणं तथा च कन्स्ट्रक्टर् बॉडी इत्यस्मिन् कोड् करणं समावेशितम् अस्ति । विशिष्टानि पदानि निम्नलिखितरूपेण सन्ति ।वर्गस्य उदाहरणप्रारम्भखण्डं निष्पादयन्तु । वंशजपदानुक्रमानुसारं मातापितृवर्गस्य कन्स्ट्रक्टर् मेथड् उपरितः अधः यावत् निष्पादयन्तु । स्पष्टतया निर्दिष्टमूल्यानां कृते उदाहरणचरानाम् आरम्भं कुर्वन्तु । वर्गस्य कन्स्ट्रक्टर् मेथड् इत्यस्य मुख्यभागं निष्पादयन्तु ।
public class MyClass {
private int value;
public MyClass ( int value) {
this . value = value;
}
public static void main ( String [ ] args) {
MyClass obj = new MyClass ( 10 ) ;
}
}
उपर्युक्तस्य कोड उदाहरणस्य निष्पादनप्रक्रिया निम्नलिखितरूपेण अस्ति । वर्गभारनम्: JVM MyClass लोड् कृतम् अस्ति वा इति परीक्षते । यदि न लोड् भवति तर्हि MyClass वर्गः लोड् भवति । स्मृतिविनियोगः : MyClass इत्यस्य नूतनदृष्टान्तस्य कृते राशे स्मृतिविनियोगं कुर्वन्तु । स्मृतिप्रारम्भः : पूर्वनिर्धारितमूल्यानां कृते आवंटितस्मृतिं आरभत । वस्तुशीर्षकं सेट् कुर्वन्तु : वस्तुशीर्षके मेटाडाटा सेट् कुर्वन्तु । Constructor initialization: MyClass इत्यस्य कन्स्ट्रक्टर् निष्पादयन्तु तथा च instance variable value 10 यावत् initialize कुर्वन्तु ।
सन्दर्भाः