आदिम क्षेत्र कहाँ संग्रहीत हैं?
आदिम क्षेत्रों को उस वस्तु के हिस्से के रूप में संग्रहीत किया जाता है जो कहीं-कहीं तात्कालिक है । यह सोचने का सबसे आसान तरीका है कि यह कहाँ है - ढेर। हालांकि , यह हमेशा मामला नहीं होता है। जैसा कि जावा सिद्धांत और व्यवहार में वर्णित है : शहरी प्रदर्शन किंवदंतियों, पर दोबारा गौर :
जेवीएम बच निकलने के विश्लेषण नामक एक तकनीक का उपयोग कर सकते हैं, जिसके द्वारा वे बता सकते हैं कि कुछ वस्तुएं अपने पूरे जीवनकाल के लिए एक ही धागे तक सीमित रहती हैं, और यह जीवनकाल किसी दिए गए स्टैक फ्रेम के जीवनकाल से घिरा होता है। ऐसी वस्तुओं को ढेर के बजाय ढेर पर सुरक्षित रूप से आवंटित किया जा सकता है। इससे भी बेहतर, छोटी वस्तुओं के लिए, जेवीएम आवंटन को पूरी तरह से हटा सकता है और बस ऑब्जेक्ट के फ़ील्ड्स को रजिस्टरों में फहरा सकता है।
इस प्रकार, यह कहने से परे कि "ऑब्जेक्ट बनाया गया है और क्षेत्र भी है", कोई यह नहीं कह सकता है कि क्या कुछ ढेर पर या स्टैक पर है। ध्यान दें कि छोटी, छोटी जीवित वस्तुओं के लिए, यह संभव है कि 'ऑब्जेक्ट' मेमोरी में मौजूद नहीं होगा और इसके बजाय इसके क्षेत्र सीधे रजिस्टरों में रखे जा सकते हैं।
कागज के साथ समाप्त होता है:
जेवीएम आश्चर्यजनक रूप से उन चीजों का पता लगाने में अच्छे हैं जो हम केवल डेवलपर को पता कर सकते थे। केस-बाय-केस आधार पर स्टैक एलोकेशन और हीप एलोकेशन के बीच जेवीएम का चुनाव करने से, हम प्रोग्रामर को बिना स्टैक पर आवंटन या हीप पर आवंटन किए बिना स्टैक आवंटन के प्रदर्शन लाभ प्राप्त कर सकते हैं।
इस प्रकार, यदि आपके पास ऐसा कोड है जो दिखता है:
void foo(int arg) {
Bar qux = new Bar(arg);
...
}
जहां उस दायरे को छोड़ने की ...
अनुमति नहीं है qux
, इसके बजाय स्टैक पर आवंटित किया जा qux
सकता है। यह वास्तव में VM के लिए एक जीत है क्योंकि इसका मतलब है कि इसे कभी भी एकत्र किए जाने वाले कचरे की आवश्यकता नहीं है - जब यह गुंजाइश छोड़ देगा तो यह गायब हो जाएगा।
विकिपीडिया पर पलायन विश्लेषण पर अधिक । कागजों में तल्लीन करने के इच्छुक लोगों के लिए, आईबीएम से जावा के लिए एस्केप एनालिसिस । C # दुनिया से आने वालों के लिए, आप एरिक लिप्टर्ट द्वारा पढ़े गए स्टैक इज़ इंप्लीमेंटेशन डिटेल और ट्रुथ टाइप वैल्यू टाइप के बारे में जान सकते हैं (वे जावा प्रकारों के लिए भी उपयोगी हैं क्योंकि कई अवधारणाएं और पहलू समान या समान हैं) । .Net पुस्तकें स्टैक बनाम हीप मेमोरी आवंटन के बारे में बात क्यों करती हैं? इसमें भी जाता है।
ढेर के ढेर और ढेर पर
ढेर पर
तो, स्टैक या हीप क्यों है? गुंजाइश छोड़ने वाली चीजों के लिए, स्टैक महंगा हो सकता है। कोड पर विचार करें:
void foo(String arg) {
bar(arg);
...
}
void bar(String arg) {
qux(arg);
...
}
void qux(String arg) {
...
}
पैरामीटर स्टैक का भी हिस्सा हैं। इस स्थिति में कि आपके पास ढेर नहीं है, आप स्टैक पर मूल्यों का पूरा सेट पास करेंगे। यह "foo"
छोटे तार के लिए ठीक है ... लेकिन अगर किसी ने उस स्ट्रिंग में एक बड़ी XML फ़ाइल डाल दी तो क्या होगा। प्रत्येक कॉल स्टैक पर पूरे विशाल स्ट्रिंग को कॉपी करेगा - और यह काफी बेकार होगा।
इसके बजाय, उन वस्तुओं को रखना बेहतर होता है जिनके पास कुछ जीवन तत्काल दायरे के बाहर होता है (दूसरे दायरे में पारित हो जाता है, एक ऐसी संरचना में अटक जाता है जिसे कोई और बनाए रख रहा है, आदि ...) दूसरे क्षेत्र में जिसे ढेर कहा जाता है।
ढेर पर
आपको स्टैक की आवश्यकता नहीं है । एक, काल्पनिक रूप से, एक ऐसी भाषा लिख सकता है जो स्टैक का उपयोग नहीं करता है (मनमानी गहराई का)। एक पुरानी बुनियादी बात जो मैंने अपनी युवावस्था में सीखी थी, उसने ऐसा किया था कि कोई केवल 8 स्तर की gosub
कॉल कर सकता था और सभी चर वैश्विक थे - कोई स्टैक नहीं था।
स्टैक का लाभ यह है कि जब आपके पास एक वैरिएबल होता है जो एक स्कोप के साथ मौजूद होता है, जब आप उस स्कोप को छोड़ देते हैं, तो स्टैक फ्रेम पॉप हो जाता है। यह वास्तव में सरल है कि क्या है और क्या नहीं है। कार्यक्रम एक और प्रक्रिया, एक नया स्टैक फ्रेम में ले जाता है; कार्यक्रम प्रक्रिया पर लौटता है, और आप अपने वर्तमान दायरे को देखने वाले में वापस आ गए हैं; कार्यक्रम प्रक्रिया छोड़ देता है और स्टैक पर मौजूद सभी वस्तुओं को हटा दिया जाता है।
यह वास्तव में कोड को ढेर और ढेर का उपयोग करने के लिए रनटाइम लिखने वाले व्यक्ति के लिए जीवन को आसान बनाता है। वे कोड पर काम करने की कई अवधारणाओं और तरीकों से स्पष्ट रूप से सोचने वाले व्यक्ति को भाषा में कोड लिखने की अनुमति देते हैं।
स्टैक की प्रकृति भी इसका मतलब है कि यह खंडित नहीं हो सकता है। स्मृति विखंडन ढेर के साथ एक वास्तविक समस्या है। आप कुछ वस्तुओं को आवंटित करते हैं, फिर कचरा एक मध्य इकट्ठा करते हैं, और फिर अगले बड़े एक को आवंटित करने के लिए जगह खोजने का प्रयास करते हैं। यह एक गड़बड़ है। स्टैक पर चीजों को रखने में सक्षम होने के बजाय इसका मतलब है कि आपको उससे निपटना नहीं है।
जब कुछ कचरा इकट्ठा किया जाता है
जब कोई कचरा इकट्ठा किया जाता है, तो वह चला जाता है। लेकिन यह केवल कचरा एकत्र किया जाता है क्योंकि इसके बारे में पहले से ही भूल गया है - कार्यक्रम में ऑब्जेक्ट के लिए अधिक संदर्भ नहीं हैं जो कार्यक्रम की वर्तमान स्थिति से एक्सेस किए जा सकते हैं।
मैं बताता हूं कि यह कचरा संग्रहण का एक बहुत बड़ा सरलीकरण है। कई कचरा संग्रहकर्ता हैं (यहां तक कि जावा के भीतर भी - आप विभिन्न झंडे ( डॉक्स ) का उपयोग करके कचरा कलेक्टर को ट्विक कर सकते हैं । ये अलग-अलग व्यवहार करते हैं और इस बात की बारीकियां हैं कि प्रत्येक व्यक्ति इस उत्तर के लिए कितना गहरा है। आप इसे पढ़ने की इच्छा कर सकते हैं। जावा कचरा संग्रह मूल बातें इस बात का एक बेहतर विचार प्राप्त करने के लिए कि उनमें से कुछ कैसे काम करता है।
उस ने कहा, अगर कुछ स्टैक पर आवंटित किया जाता है, तो यह कचरा का हिस्सा नहीं होता है System.gc()
- जब स्टैक फ्रेम का उपयोग होता है तो इसे हटा दिया जाता है। यदि कुछ ढेर पर है, और स्टैक पर कुछ से संदर्भित है, तो यह उस समय कचरा एकत्र नहीं किया जाएगा।
यह बात क्यों है?
अधिकांश भाग के लिए, इसकी परंपरा। लिखित किताबें और संकलक कक्षाएं और विभिन्न बिट्स प्रलेखन ढेर और स्टैक के बारे में एक बड़ी बात करते हैं।
हालांकि, आज की आभासी मशीनें (जेवीएम और इसी तरह) यह प्रोग्रामर से छिपाए रखने की कोशिश करने के लिए बहुत बड़ी लंबाई में चली गई हैं। जब तक आप एक या दूसरे से बाहर नहीं निकल रहे हैं और यह जानने की जरूरत है कि (केवल भंडारण स्थान को उचित रूप से बढ़ाने के बजाय), यह बहुत ज्यादा मायने नहीं रखता है।
वस्तु कहीं और है और उस स्थान पर जहां उसे सही तरीके से और जल्दी से उचित समय तक पहुंचाया जा सकता है कि वह मौजूद है। यदि इसके ढेर या ढेर पर - यह वास्तव में कोई फर्क नहीं पड़ता।