2015-12-23 8 views
5

मेरे आवेदन को प्रोफाइल करते समय मैं एक अजीब व्यवहार में आया - DestroyJavaVM थ्रेड हमेशा चल रहा है - 100% समय।DestroyJavaVM धागा हमेशा चल रहा है

enter image description here विषय, वहाँ ऑनलाइन शायद ही है, जिस पर किसी भी महत्वपूर्ण जानकारी पर एक छोटे से अनुसंधान करने के बाद, सभी मैं समझ गया कि इस सूत्र unload the JVM upon exit ले आते है।

यदि ऐसा है, तो यह थ्रेड रनिंग राज्य में 100% समय क्यों है जब मैंने अपना आवेदन शुरू किया था? क्या यह मूल्यवान संसाधनों का उपभोग नहीं करता है और इसलिए OutOfMemoryError (जैसा कि मुझे कभी-कभी मिलता है) का कारण बन सकता है?

क्या इस धागे वास्तव में क्या करता है और इसके प्रारंभिकरण को किस प्रकार ट्रिगर करता है इसका कोई आधिकारिक संदर्भ है?

धन्यवाद

+0

यह अधिक संभावना है कि अन्य धागे 'ओओएमई' का कारण बन रहे हैं। मैं कम से कम स्पष्ट संदिग्ध से शुरू नहीं होगा। क्या आपने मेमोरी उपयोग के लिए अपने आवेदन धागे का प्रोफाइल किया है? यह आपके रहस्यमय 'ओओएमई' को डिबग करने का सीधा आगे होगा। उत्तर के लिए – Kayaman

+0

10x। बेशक मैंने यह पता लगाने के लिए अन्य उपायों का उपयोग किया कि मुझे ओओएमई क्यों मिलती है (जो, बीटीडब्ल्यू एक "जीसी ओवरहेड सीमा पार हो गई" त्रुटि है, जो उच्च CPU उपयोग के कारण होती है), लेकिन इसका कोई फायदा नहीं हुआ। यह मेरा आखिरी उपाय है। यह धागा बहुत संदिग्ध है और मैं जानना चाहता हूं कि यह किस समय 100% चल रहा है। उत्तर के लिए – KidCrippler

उत्तर

31

यह इसलिए होता है क्योंकि ज्यादातर आवेदनों धागे में चलाए जा रहे हैं।

सभी POJO ऐप्स main विधि का आविष्कार करके शुरू होते हैं। इसके सबसे सरल मामले में यह विधि सभी काम करेगी, ऑब्जेक्ट्स बनाने, कॉलिंग विधियों इत्यादि। एक बार main पूर्ण हो जाती है, JVM को DestroyJavaVM थ्रेड का उपयोग करके बंद करने के लिए कहा जाता है जो सभी काम करने से पहले सभी गैर-डिमन थ्रेड को पूरा करने के लिए प्रतीक्षा करता है । यह सुनिश्चित करना है कि आपके द्वारा बनाए गए किसी भी धागे को JVM से पहले पूरा करने के लिए चलाया गया है।

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

नतीजतन, कोई भी ऐप जो धागे बनाता है और पूरी तरह से उनकी कार्यक्षमता पर निर्भर करता है, उसके पास DestroyJavaVM थ्रेड समाप्त होने की प्रतीक्षा कर रहा है। चूंकि यह सब कुछ कर रहा है join अन्य सभी चल रहे धागे में यह किसी भी संसाधन का उपभोग नहीं करता है।

+0

10x। मेरे ऐप में कोई जीयूआई नहीं है। मैं बहुत सारे धागे को तत्काल कर रहा हूं, और निश्चित रूप से उनकी कार्यक्षमता पर भरोसा करता हूं। क्या DestroyJavaVM थ्रेड के साथ इसका कोई संबंध नहीं है? वास्तव में क्या इसकी शुरुआत शुरू होती है? यदि मैं आपको सही ढंग से समझता हूं, तो आप कहते हैं कि थ्रेड को रनिंग के रूप में दिखाया गया है, लेकिन वास्तव में यह वाकई इंतजार कर रहा है? – KidCrippler

+3

@ किडक्रिपलर - यह 'मुख्य' निकास के बाद बनाया और शुरू किया गया है। देखें [Thread.join()] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Thread.java#Thread.join%28long % 2 9) क्यों यह 'रनिंग' स्थिति में है - यह एक तंग लूप में 'प्रतीक्षा (0)' का उपयोग करता है। – OldCurmudgeon

+0

यह सिर्फ शानदार जवाब है। इसे लिखने के लिए धन्यवाद। मैं यहाँ यादृच्छिक रूप से ब्राउज़िंग आया था, किसी भी समाधान की तलाश नहीं कर रहा था, लेकिन आपके जवाब ने मुझे वोट देने के लिए प्रेरित किया। :) –

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