2010-03-11 18 views
69

यह प्रश्न कुछ साइट पर पोस्ट किया गया था। मुझे वहां सही जवाब नहीं मिला, इसलिए मैं इसे यहां फिर से पोस्ट कर रहा हूं।जावा थ्रेड कचरा एकत्रित या नहीं

public class TestThread { 
    public static void main(String[] s) { 
     // anonymous class extends Thread 
     Thread t = new Thread() { 
      public void run() { 
       // infinite loop 
       while (true) { 
        try { 
         Thread.sleep(1000); 
        } catch (InterruptedException e) { 
        } 
        // as long as this line printed out, you know it is alive. 
        System.out.println("thread is running..."); 
       } 
      } 
     }; 
     t.start(); // Line A 
     t = null; // Line B 
     // no more references for Thread t 
     // another infinite loop 
     while (true) { 
      try { 
       Thread.sleep(3000); 
      } catch (InterruptedException e) { 
      } 
      System.gc(); 
      System.out.println("Executed System.gc()"); 
     } // The program will run forever until you use ^C to stop it 
    } 
} 

मेरी क्वेरी थ्रेड को रोकने के बारे में नहीं है। मुझे अपने प्रश्न को दोबारा दोहराएं। रेखा ए (उपरोक्त कोड देखें) एक नया थ्रेड शुरू करता है; और रेखा बी धागा संदर्भ शून्य बनाते हैं। इसलिए, JVM में अब एक थ्रेड ऑब्जेक्ट है (जो चलने वाले राज्य में है) जिसके लिए कोई संदर्भ मौजूद नहीं है (जैसा कि रेखा बी में टी = शून्य है)। तो मेरा सवाल यह है कि, यह धागा (मुख्य धागे में अब कोई संदर्भ नहीं है) मुख्य धागा चलने तक चल रहा है। मेरी समझ के अनुसार, थ्रेड ऑब्जेक्ट को लाइन बी के बाद एकत्रित कचरा होना चाहिए था। मैंने इस कोड को 5 मिनट और अधिक के लिए चलाने की कोशिश की, जावा रनटाइम जीसी चलाने के लिए अनुरोध किया, लेकिन थ्रेड बस रुकता नहीं है।

आशा है कि इस समय कोड और प्रश्न दोनों स्पष्ट हैं।

उत्तर

102

एक चलने वाले धागे को तथाकथित कचरा संग्रह रूट माना जाता है और उन चीजों में से एक है जो सामान को कचरा होने से रोकते हैं। जब कचरा कलेक्टर निर्धारित करता है कि आपकी ऑब्जेक्ट 'reachable' है या नहीं, तो यह हमेशा संदर्भ बिंदु के रूप में कचरा कलेक्टर जड़ों के सेट का उपयोग करके ऐसा कर रहा है।

इस पर विचार करें, आपका मुख्य धागा कचरा क्यों नहीं है, कोई भी इसका संदर्भ नहीं दे रहा है।

+10

यह उत्तर, जैसा कि वर्तमान में खड़ा है, सवाल उठता है अगर थ्रेड जीसीड किया जा सकता है (वे समाप्त होने के बाद)। चूंकि इस प्रश्न को [इस एक] के डुप्लिकेट के रूप में चिह्नित किया गया है (http://stackoverflow.com/questions/10380327/java-threads-and-garbage-collector), यह उल्लेख किया जाना चाहिए कि धागे को अब " कचरा संग्रहण जड़ें "समाप्त होने के बाद, और इस प्रकार, वे जीसी के लिए पहुंच योग्य बन जाते हैं। – bluenote10

+0

@ bluenote10 सही, इसलिए वाक्यांश "चलने वाला धागा"। – falstro

+10

अंतिम वाक्य penetrating है: "आपका मुख्य धागा कचरा क्यों नहीं है ..."। – Determinant

15

जेवीएम में सभी चल रहे धागे का संदर्भ है।

कोई थ्रेड (या जो चीजें इसे संदर्भित करता है) कचरा-संग्रहित होगा जबकि यह अभी भी चल रहा है।

8

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

जब थ्रेड बनाया जाता है तो यह वर्तमान थ्रेड समूह में जोड़ा जाता है। आप वर्तमान थ्रेड समूह में थ्रेड की एक सूची प्राप्त कर सकते हैं, इसलिए इसका संदर्भ पाने का एक और तरीका है।

18

जैसा समझाया गया था, चलने वाले धागे परिभाषा के अनुसार जीसी से प्रतिरक्षा हैं। जीसी ने "जड़ें" स्कैन करके अपना काम शुरू किया, जिसे हमेशा पहुंचने योग्य समझा जाता है; जड़ों में वैश्विक चर (जावा-टॉक में "स्थैतिक फ़ील्ड") और सभी चल रहे थ्रेड के ढेर शामिल हैं (यह कल्पना की जा सकती है कि चलने वाले धागे का ढेर संबंधित Thread उदाहरण के संदर्भ में है)।

हालांकि, आप थ्रेड को "डेमन" धागा बना सकते हैं (Thread.setDaemon(boolean) देखें)। एक डिमन थ्रेड एक गैर-डिमन थ्रेड से अधिक कचरा-एकत्र नहीं होता है, लेकिन जब भी सभी चल रहे धागे डिमन होते हैं तो JVM निकलता है। कल्पना करने का एक तरीका यह है कि प्रत्येक थ्रेड, जब यह समाप्त हो जाता है, यह जांचता है कि कुछ गैर-डिमन चलने वाले थ्रेड हैं या नहीं; यदि नहीं, तो समाप्ति थ्रेड System.exit() कॉल को बल देता है, जो JVM से बाहर निकलता है (चल रहे डेमन थ्रेड को मार रहा है)। यह एक जीसी से संबंधित मुद्दा नहीं है; एक तरह से, धागे मैन्युअल रूप से आवंटित किए जाते हैं। हालांकि, इस प्रकार जेवीएम अर्ध-दुष्ट धागे को सहन कर सकता है। यह आमतौर पर Timer उदाहरणों के लिए उपयोग किया जाता है।

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