2013-11-24 3 views
5

सी में exit(0) का उपयोग करने के लिए कोई अच्छा अभ्यास नहीं है, यदि विकल्प हैं, क्योंकि यह उदाहरण के लिए संसाधन मुक्त नहीं करता है। लेकिन जावा में System.exit(0) का उपयोग करने के लिए - यह यहां कैसा है? क्या इस संदर्भ में कचरा कलेक्टर पर भरोसा किया जा सकता है?जावा में सी और System.exit (0) में निकास (0) का अभ्यास

सी भाषा:

exit(0); 

जावा:

System.exit(0) 
+8

यदि आप एप्लिकेशन को मारने वाले हैं तो कचरा संग्रहण की परवाह क्यों करते हैं? –

+1

यह अप्रासंगिक है - आप एप्लिकेशन को मारने वाले हैं। यह सभी स्मृति मुक्त कर देगा। तो कचरा संग्रह की परवाह क्यों करें? – SevenBits

+0

@ सॉटिरियोस डेलिमैनोलिस - नहीं! जावा एंड्रॉइड में आप गतिविधि को मार सकते हैं, एसर – user2991252

उत्तर

2

लेकिन उपयोग करने के लिए System.exit (0) जावा में - कैसे इसे यहाँ है? क्या इस संदर्भ में कचरा-कलेक्टर पर भरोसा किया जा सकता है?

जब आप जावा में System.exit फोन, कचरा कलेक्टर सामान्य रूप से नहीं चला है। हालांकि, किसी भी जेवीएम में मैंने कभी सुना है, कुछ और है जो आवंटित सभी वस्तुओं को पुनः प्राप्त करता है। (आमतौर पर इसे ऑपरेटिंग सिस्टम स्तर पर संभाला जाता है।)

तथ्य यह है कि जीसी नहीं चलता है, यदि आप ऑब्जेक्ट फ़ाइनलाइज़र पर निर्भर हैं तो JVM समाप्त होने से पहले कुछ महत्वपूर्ण है।

हाइपोटेटिक रूप से, यदि आपके जावा एप्लिकेशन ने देशी तरीकों को कॉल करने के लिए जेएनआई (आदि) का उपयोग किया, तो वे विधियां सिस्टम संसाधनों तक पहुंच सकती हैं जो समस्याग्रस्त हो सकती हैं। हालांकि:

  1. एक सामान्य नियम के ऑपरेटिंग सिस्टम ऐसी बातों का ख्याल रखना करता है। कम से कम यह लिनक्स और यूनिक्स, AFAIK के आधुनिक संस्करणों के लिए करता है।

  2. कचरा कलेक्टर को वैसे भी उन संसाधनों का कोई ज्ञान नहीं है। यदि ओएस उन्हें पुनः प्राप्त नहीं कर सकता है, तो जावा कचरा कलेक्टर मदद नहीं करेगा।

आप (मूल कोड के माध्यम से) एक जावा प्रोग्राम द्वारा अधिग्रहीत ऐसे संसाधनों को साफ करने की जरूरत थी तो सबसे अच्छा तरीका मूल कोड तरीकों में सफाई को लागू करना तथा चलाने के लिए एक "बंद हुक" का उपयोग करने के होगा उन्हें। यदि आप System.exit पर कॉल करते हैं तो शट डाउन हुक चलाए जाएंगे।


1 - एक कचरा संग्रहण JVM बाहर निकलने पर प्रदर्शन किया जाएगा यदि आपने पहले runFinalizersOnExit(true) कहा जाता है। हालांकि, यह विधि से वंचित है। ओरेकल साइट इसे इस तरह बताते हैं:

प्र: Runtime.runFinalizersOnExit बहिष्कृत हो गई है?

ए: क्योंकि यह स्वाभाविक रूप से असुरक्षित है। इसके परिणामस्वरूप अंतिम वस्तुओं को अंतिम वस्तुओं पर बुलाया जा सकता है जबकि अन्य धागे एक साथ उन वस्तुओं को जोड़ते हैं, जिसके परिणामस्वरूप अनियमित व्यवहार या डेडलॉक होता है। हालांकि इस समस्या को रोका जा सकता है यदि जिस वर्ग की वस्तुओं को अंतिम रूप दिया जा रहा है, उसे इस कॉल के खिलाफ "बचाव" करने के लिए कोड किया गया था, तो अधिकांश प्रोग्रामर इसके खिलाफ बचाव नहीं करते हैं। वे मानते हैं कि उस समय एक ऑब्जेक्ट मर चुका है जब इसके फाइनलाइज़र को बुलाया जाता है।

आगे, कॉल इस अर्थ में "थ्रेड-सुरक्षित" नहीं है कि यह एक वीएम-वैश्विक ध्वज सेट करता है। यह लाइव ऑब्जेक्ट्स को अंतिम रूप देने के खिलाफ बचाव के लिए प्रत्येक वर्ग को अंतिम रूप देने के लिए मजबूर करता है!

संक्षेप में, यह एक खतरनाक दृष्टिकोण है, और यह सीधे संसाधनों की तरह है कि ओपी के बारे में चिंतित है के साथ सौदा नहीं होगा।

+0

सामान्य रूप से, यह करता है, हां, लेकिन अक्सर सिस्टम वी आईपीसी ऑब्जेक्ट प्रक्रिया समाप्त होने के बाद ही रहेगा जबतक कि आप उन्हें साफ करने के लिए विशेष प्रयास नहीं करते। मैंने साझा मेमोरी सेक्शन पर लिनक्स कर्नेल सीमा को मारा है, जब मैं प्रोग्राम पर काम कर रहा था, जब मैं प्रोग्राम पर डिबगिंग/फिक्सिंग कर रहा था, तो कई बार पंक्ति पर कई बार डंप किया गया था। संदेश कतारों और सेमफोरों के साथ भी ऐसा ही हो सकता है। लिनक्स पर आईपीसीएस और आईपीसीआरएम के लिए मैन पेज देखें। – George

+1

_ "जब आप जावा में 'System.exit' को कॉल करते हैं, तो कचरा कलेक्टर नहीं चलाया जाता है।" _ - यह एंड्रॉइड में गलत हो सकता है। [डॉक्स] से (http://developer.android.com/reference/java/lang/Runtime.html#exit%28int%29): _ "अगर रनफिनलाइजर्सऑनएक्सिट (बूलियन) को पहले एक सच्चे तर्क के साथ बुलाया गया है, तो ** सभी ऑब्जेक्ट्स कचरे से एकत्रित होंगे ** और पहले अंतिम रूप दिया जाएगा। "_ (जोर जोड़ा गया) –

+0

@ टेडहोप - जावा एसई (कम से कम) पर उस विधि को बहिष्कृत किया गया है। हालांकि, मैंने उस जानकारी को फुटनोट के रूप में जोड़ा है। –

1

इस तरह के बारे में सोचें। सी में, आप अपने स्रोत कोड को एक बाइनरी फ़ाइल में बना रहे हैं जो लॉजिकल प्रोग्रामिंग के नियमों और आपके ओएस द्वारा निर्धारित नियमों के अनुरूप ही स्वयं ही निष्पादित करेगा। ओएस हालांकि आपके लिए आपकी याददाश्त का प्रबंधन नहीं करता है। यह घटनाओं को संभालता है और हार्डवेयर को जानकारी भेजता है जो बताता है कि कैसे दौड़ना है, और कुछ नहीं, कुछ भी कम नहीं। जावा में, सभी कोड जावा के अपने बाइटकोड में संकलित किए जाते हैं। निष्पादन पर यह वास्तव में किसी भी समय ओएस से संवाद नहीं करता है। उस बाइटकोड को चलाने के लिए डिज़ाइन की गई आभासी मशीन बात करता है। जब आप System.exit (0) को कॉल करते हैं, तो आप वर्चुअल मशीन को बता रहे हैं कि जिस ऐप को आप चल रहे हैं वह एक रुकावट में आ रहा है, वहां से मशीन आईटी की खुद की स्मृति को संभालती है जो कि ऐसा कुछ भी शामिल होता है जिसे आपने पहले ही नहीं हटाया था कचरा कलेक्टर लेकिन केवल अगर वीएम बाहर निकल रहा है। उम्मीद है कि

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