AFAIK, JVM विनिर्देशन (अंग्रेजी में लिखा गया) का उल्लेख नहीं है जब वास्तव में एक वस्तु (या एक मूल्य) को हटा दिया जाना चाहिए, और इसे लागू करने के लिए छोड़ देता है (इसी तरह R5RS के लिए )। इसे किसी तरह एक कचरा संग्रहकर्ता की आवश्यकता होती है या सुझाव देता है लेकिन कार्यान्वयन के लिए विवरण छोड़ देता है। और इसी तरह जावा विनिर्देशन के लिए।
याद रखें कि प्रोग्रामिंग भाषाओं हैं विनिर्देशों (की वाक्य रचना , अर्थ विज्ञान , नहीं सॉफ्टवेयर कार्यान्वयन, आदि ...)। जावा (या इसके जेवीएम) जैसी भाषा में कई कार्यान्वयन हैं। इसका विनिर्देश प्रकाशित , डाउनलोड करने योग्य है (इसलिए आप इसका अध्ययन कर सकते हैं) और अंग्रेजी में लिखा गया है। M2.5.3 JVM युक्ति के ढेर में कचरा बीनने वाले का उल्लेख है:
वस्तुओं के लिए ढेर भंडारण एक स्वचालित भंडारण प्रबंधन प्रणाली (कचरा कलेक्टर के रूप में जाना जाता है) द्वारा पुनः प्राप्त किया जाता है; वस्तुओं को स्पष्ट रूप से निपटाया नहीं जाता है। जावा वर्चुअल मशीन किसी विशेष प्रकार के स्वचालित भंडारण प्रबंधन प्रणाली को नहीं मानती है
(जोर मेरा है; जावा कल्पना के ization12.6 में बीटीडब्लू फाइनल का उल्लेख किया गया है और एक मेमोरी मॉडल जावा कल्पना के §17.4 में है)
तो (जावा में) आपको ध्यान नहीं देना चाहिए कि जब कोई ऑब्जेक्ट डिलीट हो जाता है , और आप कोड कर सकते हैं -जैसे कि ऐसा नहीं होता है (एक एब्सट्रैक्शन में तर्क द्वारा जहां आप उस पर ध्यान नहीं देते हैं)। बेशक आपको मेमोरी खपत और जीवित वस्तुओं के सेट की देखभाल करने की आवश्यकता है, जो एक अलग सवाल है। कई सरल मामलों में (एक "हैलो वर्ल्ड" प्रोग्राम के बारे में सोचें) आप खुद को समझाने के लिए सिद्ध हो सकते हैं- कि आवंटित मेमोरी छोटी है (उदाहरण के लिए एक गीगाबाइट से कम), और फिर आप बिल्कुल भी परवाह नहीं करते हैं व्यक्तिगत वस्तुओं का विलोपन । अधिक मामलों में, आप अपने आप को समझा सकते हैं कि जीवित वस्तुएं(या पहुंच से बाहर वाले, जो कि जीवित लोगों के बारे में तर्क करने के लिए एक सुपरसेट है) कभी भी एक उचित सीमा से अधिक नहीं होता है (और फिर आप जीसी पर भरोसा करते हैं, लेकिन आपको परवाह नहीं है कि कचरा संग्रह कैसे और कब होता है)। अंतरिक्ष जटिलता के बारे में पढ़ें ।
मुझे लगता है कि कई JVM कार्यान्वयनों पर एक हेल्लो वर्ल्ड वन की तरह एक अल्पकालिक जावा प्रोग्राम चल रहा है, कचरा कलेक्टर को बिल्कुल भी ट्रिगर नहीं किया जाता है और कोई विलोपन नहीं होता है। AFAIU, इस तरह के व्यवहार कई जावा चश्मा के अनुरूप है।
अधिकांश JVM कार्यान्वयन का उपयोग पीढ़ीगत नकल तकनीक (सबसे जावा वस्तुओं के लिए कम से कम, का उपयोग नहीं कर उन को अंतिम रूप देने या कमजोर संदर्भ ;, और अंतिम रूप देने के कम समय में होने की गारंटी नहीं है और स्थगित किया जा सकता है तो बस एक उपयोगी सुविधा है कि आपके कोड नहीं करना चाहिए बहुत कुछ निर्भर करता है) जिसमें किसी व्यक्तिगत वस्तु को हटाने की धारणा का कोई मतलब नहीं होता है (चूंकि कई ऑब्जेक्ट्स के लिए मेमोरी-जोनिंग मेमोरी ज़ोन का एक बड़ा ब्लॉक-, शायद एक साथ कई मेगाबाइट्स, एक ही बार में रिलीज़ हो जाते हैं)।
यदि JVM विनिर्देशन के लिए आवश्यक है कि प्रत्येक वस्तु को यथाशीघ्र हटा दिया जाए (या बस वस्तु विघटन पर और अधिक अड़चनें डाल दी जाए), कुशल जेनेशनल GC तकनीक निषिद्ध होगी, और जावा और JVM के डिज़ाइनर इससे बचने में बुद्धिमान रहे हैं।
BTW, यह संभव हो सकता है कि एक भोली JVM जो कभी भी वस्तुओं को नहीं हटाता है और मेमोरी को रिलीज़ नहीं करता है वह ऐनक (पत्र, आत्मा नहीं) के अनुरूप हो सकता है और निश्चित रूप से अभ्यास में एक हैलो वर्ल्ड चीज़ को चलाने में सक्षम है (ध्यान दें कि सबसे छोटे और अल्पकालिक जावा प्रोग्राम शायद कुछ गिगाबाइट्स से अधिक मेमोरी आवंटित नहीं करते हैं)। बेशक इस तरह के एक जेवीएम उल्लेख के लायक नहीं है और सिर्फ एक खिलौना चीज है (जैसे कि सी के लिए यह कार्यान्वयन malloc
है)। अधिक के लिए एप्सिलॉन नूप जीसी देखें । वास्तविक जीवन JVM सॉफ्टवेयर के बहुत जटिल टुकड़े हैं और कई कचरा संग्रह तकनीकों को मिलाते हैं।
इसके अलावा, जावा जेवीएम के समान नहीं है, और आपके पास जावा कार्यान्वयन जेवीएम के बिना चल रहा है (जैसे कि आगे जावा कंपाइलर, एंड्रॉइड रनटाइम )। में कुछ मामलों (ज्यादातर शैक्षिक वाले), तो आप कल्पना कीजिए कि एक जावा प्रोग्राम का आवंटन या क्रम (जैसे पर नहीं हटाते हैं क्योंकि (ताकि "संकलन समय कचरा संग्रहण" तकनीक कहा जाता है) हो सकता है अनुकूलन संकलक काफी चतुर को केवल का उपयोग किया गया है कॉल स्टैक और स्वचालित चर )।
जब वे अब संदर्भित नहीं होते हैं, तो Java ऑब्जेक्ट तुरंत हटाए नहीं जाते हैं?
क्योंकि Java और JVM स्पेक्स की आवश्यकता नहीं है।
अधिक (और JVM कल्पना ) के लिए GC हैंडबुक पढ़ें । ध्यान दें कि किसी वस्तु के लिए जीवित (या भविष्य की गणना के लिए उपयोगी) एक संपूर्ण-कार्यक्रम (गैर-मॉड्यूलर) संपत्ति है।
उद्देश्य-सी स्मृति प्रबंधन के लिए एक संदर्भ गिनती दृष्टिकोण का पक्षधर है । और इसमें भी नुकसान होते हैं (उदाहरण के लिए ऑब्जेक्टिव-सी प्रोग्रामर को कमजोर संदर्भों की खोज करके परिपत्र संदर्भों की देखभाल करनी होती है , लेकिन एक जेवीएम जावा प्रोग्रामर से ध्यान हटाने की आवश्यकता के बिना परिपत्र संदर्भों को अच्छी तरह से संभालता है)।
नहीं है कोई जादुई शब्द प्रोग्रामिंग और प्रोग्रामिंग भाषा डिजाइन में (के बारे में पता होना लंगड़ा समस्या ; एक उपयोगी रहने वाले वस्तु जा रहा है अनिर्णनीय सामान्य रूप में)।
तुम भी पढ़ सकता है SICP , भाषा उपयोगितावाद प्रोग्रामिंग , ड्रैगन बुक , लिस्प छोटे टुकड़ों में और आपरेटिंग सिस्टम: तीन आसान मोहरे । वे जावा के बारे में नहीं हैं, लेकिन वे आपके दिमाग को खोलेंगे और यह समझने में मदद करेंगे कि एक जेवीएम को क्या करना चाहिए और यह आपके कंप्यूटर पर व्यावहारिक रूप से (अन्य टुकड़ों के साथ) कैसे काम कर सकता है। आप मौजूदा खुले स्रोत JVM कार्यान्वयन (जैसे OpenJDK , जिसमें कई लाखों स्रोत कोड लाइनें हैं) के जटिल स्रोत कोड का अध्ययन करने में कई महीने (या कई साल) खर्च कर सकते हैं ।