13

मैंने कचरा संग्रह के बारे में बहुत सारे लेख पढ़े और लगभग सभी लेख ढेर स्मृति के बारे में बताते हैं। तो मेरा सवाल है "कचरा संग्रह ढेर स्मृति या ढेर स्मृति या दोनों एकत्र करता है"।क्या एक कचरा कलेक्टर स्टैक मेमोरी, ढेर मेमोरी, या दोनों इकट्ठा करता है?

+0

डुप्लिकेट। http://stackoverflow.com/questions/2350000/garbage-collection – XpiritO

उत्तर

10

हीप मेमोरी।

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

2

स्टैक पहले में आखिरी है इसलिए कचरा इकट्ठा करने की कोई आवश्यकता नहीं है।

- गलत - duh!

+0

निश्चित रूप से आपका मतलब है कि पहले, आखिरी बार। –

+0

हां, लेकिन मुझे शर्ली मत कहो। –

17

यह ढेर स्मृति एकत्र करता है। आम तौर पर, स्टैक मेमोरी स्वचालित रूप से एकत्र की जाती है जब निष्पादन पथ दायरे के अंत तक पहुंच जाता है। उदा .:

void fun() 
{ 
    int n; // reservation on the stack as part of the activation record 
    ... 
} // returning the stack pointer to where it was before entering the scope 

वास्तव में, सी ++ की तरह एक भाषा में, ढेर आवंटित चर auto चर कहा जाता है।

+0

यहां अधिक जानकारी: http://msdn.microsoft.com/en-us/library/f144e03t.aspx – Michael

1

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

कचरा संग्रह इसके विपरीत केवल ढेर पर काम करता है।

0

कम से कम जावा में, स्टैक को स्वचालित रूप से डी-आवंटित किया जाएगा जब आप उस स्टैक फ्रेम को छोड़ देते हैं, इसलिए कचरा इकट्ठा करने की कोई आवश्यकता नहीं है।

मैं एक जावा प्रोग्रामर हूं इसलिए मुझे यह समस्या नहीं है, लेकिन वास्तव में सी ++ में, (मैंने सुना है) आपको इससे सावधान रहना होगा क्योंकि आप ढेर पर वस्तुओं को आवंटित कर सकते हैं, और आप छोड़ सकते हैं उस स्टैक फ्रेम, ऑब्जेक्ट को आवंटित किया जाएगा और आप अब इसका उपयोग नहीं कर सकते हैं, आदि

+0

नहीं सी ++ में, स्टैक पर संग्रहीत ऑब्जेक्ट्स फ़ंक्शन लौटने पर स्वचालित रूप से डिलीकेट किए जाते हैं। लेकिन आप ढेर पर एक ऑब्जेक्ट आवंटित कर सकते हैं, और पॉइंटर को उस ऑब्जेक्ट को ढेर पर स्टोर कर सकते हैं; फिर जब फ़ंक्शन वापस आता है और आप उस स्टैक फ्रेम को छोड़ देते हैं, तो आप ऑब्जेक्ट को लीक करते हुए पॉइंटर की एकमात्र प्रति खो देते हैं। यदि सी ++ में कचरा संग्रह बनाया गया था (यह वैकल्पिक है) यह कोई मुद्दा नहीं होगा। – dave4420

+0

@ डेव: यही कारण है कि सी ++ में स्मार्ट पॉइंटर्स हैं। –

+0

@ डेव हिनटन: और आप वर्तमान स्टैक फ्रेम पर आवंटित ऑब्जेक्ट में एक पॉइंटर पास कर सकते हैं, दूसरे स्टैक फ्रेम पर, और आश्चर्यचकित हो सकते हैं, है ना? नहीं? –

0

आप किसी विशेष तकनीक का उल्लेख नहीं करते हैं, लेकिन उपयोग भाषाओं में काफी विशिष्ट है।

कचरा कलेक्टर केवल प्रबंधित ढेर पर काम करता है। एक ही प्रक्रिया में कई ढेर हो सकते हैं, जिनमें से कुछ कचरा नहीं एकत्र किया जाता है।

स्टैक पर आवंटित चर को एक विधि लौटाते समय हटा दिया जाता है। कचरा कॉलर लाइव संदर्भों को खोजने के लिए उन चर का उपयोग करेगा, लेकिन यह स्मृति एकत्र नहीं करेगा।

1

जब तक आप एक प्रोफाइलर का उपयोग नहीं कर रहे हैं कि हम में से कोई भी नहीं जानता है, ढेर प्रमुख चिंता है। ऐसा इसलिए है क्योंकि ज्यादातर लोग जो भी अत्यधिक प्रशंसित उपकरण उन्हें बताते हैं उस पर प्रतिक्रिया करते हैं। कृपया इस पोस्ट के अंत तक पहुंचें कि अधिकतर प्रोफाइलिंग टूल जो स्थिर रूप से आवंटित स्मृति त्रुटियों को इंगित करते हैं आमतौर पर सही होते हैं। प्रोफाइलिंग सरल रिसाव और कचरा संग्रह से परे जाना चाहिए।

मुझे आप सी में एक उदाहरण देता हूँ:

#include <stdlib.h> 
#include <string.h> 

int main(void) 
{ 
    char *am_i_leaking; 

    am_i_leaking = strdup("Now, that's subjective!"); 

    return 0; 
} 

ओएस है कि इस प्रोग्राम स्वचालित रूप से ढेर को पुनः प्राप्त नहीं करता है चलाता है, मैं एक समस्या का कारण बना गया है।मैं एक आधुनिक ओएस के बारे में नहीं सोच सकता जो वास्तव में उपयोग में नहीं करता है।

अब इस पर नज़र करने देता है:

char *foo(void) 
{ 
    static char bar[1024]; 
    memset(bar, 0, sizeof(bar)); 
    snprintf(bar, sizeof(bar -1), "Do wa diddy diddy dum diddy do"); 

    return bar; 
} 

अपने संकलक कैसे आवंटित करता है कि अच्छी तरह से है, अपने संकलक पर निर्भर है। यदि आप इसका उपयोग करते हैं और परिणाम के साथ परेशान हो सकते हैं, तो आपके पास शायद टूटा कंपाइलर हो। फिर भी, अगर मेरे पास उस समारोह में 100 धागे एक बार में प्रवेश कर रहे हैं, निश्चित रूप से, परिणाम बकवास है, जब तक कि मेरा कंपाइलर जादुई रूप से पता नहीं लगाता कि मैं का अर्थ था और इसके बारे में चिंता करने के बिना पारस्परिक बहिष्करण या गतिशील आवंटन प्रस्तुत करता है, जिस बिंदु पर हम प्रोफाइलिंग ढेर के लिए वापस आ गया।

संक्षेप में, हमारे जीवनकाल में, कचरा संग्रह ढेर से संबंधित है। भविष्य में ढेर पर कुछ स्टैब्स लेने और चीजों को 'अनुकूलित करने' की कोशिश करने पर गिनें, फिर उस प्रयास पर एक व्याख्या की गई भाषा बनें जो सीईओ की मांग की मांग होगी।

इसका मतलब यह नहीं है कि स्मृति त्रुटियों को अनदेखा करना एक अच्छी बात है, इससे कोई फर्क नहीं पड़ता कि भंडारण क्या होता है।

4

ढेर को "ढेर" कहा जाता है क्योंकि यह स्मृति का एक क्षेत्र है जिसे "स्टैक पॉलिसी", उर्फ ​​लिफो (जैसे लास्ट इन, फर्स्ट आउट) के साथ प्रबंधित किया जाता है। यदि ढेर पर आवंटन "ढेर रास्ते" में नहीं किया गया था तो इसे ढेर नहीं बल्कि ढेर कहा जाएगा।

कचरे पर चीजों को आवंटित करने की समस्या का सामना करने के लिए कचरा संग्रह का आविष्कार किया गया था, यानी कि आप भविष्यवाणी नहीं कर सकते कि कौन से हिस्सों को पहले जारी किया जाएगा। जीसी स्मृति आवंटन समस्याओं के लिए है जहां स्टैक प्रबंधन पर्याप्त नहीं है।

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