2015-05-22 5 views
10

जावा 8 अद्यतन 45 में, java कॉल करने के लिए इन विकल्पों को जोड़ने:जावा में लंबे स्पिन और सिंक के समय का क्या कारण बनता है?

-XX:+PrintGCApplicationStoppedTime 
-XX:+PrintSafepointStatistics 
-XX:PrintSafepointStatisticsCount=1 

इस तरह मुझे आंकड़ों से पता चलता:

vmop [threads: total initially_running wait_to_block] [time: spin block sync cleanup vmop] page_trap_count 
3679.229: no vm operation [ 72 1 2 ] [ 6016 0 6016 0 0 ] 1 
2015-05-22T11:25:27.519+0200: Total time for which application threads were stopped: 6.0168551 seconds, Stopping threads took: 6.0164099 seconds 

समस्या यहाँ Stopping threads के लिए लंबे समय है। इस उदाहरण में, यह 6 सेकंड है जो हमारे आवेदन के लिए पहले से ही एक समस्या है, लेकिन मैंने एक उदाहरण में (पूर्ण लॉगिंग के बिना) लगभग एक मिनट में भी बड़ा समय देखा है।

वीएम ऑपरेशन (यहां: no vm operation) अलग-अलग है। मैंने भी देखा है, उदा। RevokeBias, G1IncCollectionPause, या GCG_Operation। इसके अलावा, page_trap_count अप्रासंगिक प्रतीत होता है। मैंने उदाहरण देखा है कि यह 0 था, और अन्य जहां यह 2 था। हालांकि, यह है कि समय हमेशा spin और sync के मानों में दिखाई देता है।

मैं उन समय मूल्यों spin और sync की गहराई से स्पष्टीकरण की तलाश में हूं, लेकिन ज्यादातर मुझे दिलचस्पी है कि यह क्यों हो रहा है और मैं इसके खिलाफ क्या कर सकता हूं। मुझे हमारी कॉन्फ़िगरेशन में कुछ भी 'बुराई' से अवगत नहीं है। मशीन पर बहुत सारे ऊब गए कोर और अप्रयुक्त स्मृति हैं, हम शुद्ध जावा (कोई जेएनआई) नहीं चला रहे हैं, और हम अपने कोड में किसी भी अत्यधिक सिंक्रनाइज़ेशन से अवगत नहीं हैं।

+0

आप अपने विशिष्ट उपयोग मामले के बारे में अधिक जानकारी दे सकते हैं, ताकि लोग जान सकें कि कैसे मदद करें। –

+0

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

उत्तर

2

समस्या यह है कि यह आपके एप्लिकेशन को एक सुरक्षित बिंदु तक पहुंचने में लंबा समय लगता है। Stopping threads आउटपुट JVM के बीच के समय को एक सुरक्षित बिंदु अनुरोध जारी करता है जब तक कि सभी धागे सुरक्षित बिंदु तक नहीं पहुंच जाते हैं।

sync मूल्य एक ही चीज़ दिखाता है - यह समय है कि सभी धागे सुरक्षा के लिए पहुंचने में लगते हैं।

spin और block मूल्यों बार यह safepoint तक पहुँचने के लिए blocked और spinning के लिए (क्रियान्वित कोड) धागे लेता निरूपित करते हैं।

यह जानकर हम निष्कर्ष निकाल सकते हैं कि आपके लिए समस्या यह है कि एक धागा व्यस्त कताई है और कई सेकंड में अपने सुरक्षित बिंदु तक पहुंचने में सक्षम नहीं है।

बिल्कुल ऐसा क्यों होता है कहना मुश्किल है। एक उदाहरण, जैसा कि this प्रश्न में दिखाया गया है और इसका उत्तर यह है कि जेआईटी कंपाइलर सुरक्षित लूप जांच के बिना भारी लूप संकलित कर सकता है।

आप विकल्प -XX:+SafepointTimeout -XX:SafepointTimeoutDelay=500 विकल्पों के साथ अपना JVM चलाने का प्रयास कर सकते हैं। 500 सेकंड के बाद सुरक्षित बिंदु सिंक हो जाएगा और सुरक्षित बिंदु तक पहुंचने में विफल थ्रेड के बारे में प्रिंट जानकारी होगी।

+0

धन्यवाद! मैं कोशिश करूँगा और वापस रिपोर्ट करूंगा। – malamut

+0

अतिरिक्त विकल्प वास्तव में मुझे धागा नाम देंगे (कोई ढेर नहीं, लेकिन ऐसा लगता है कि वर्तमान में इसे प्राप्त करने का कोई तरीका नहीं है)। समस्या का प्रदर्शन करने वाले अनुप्रयोगों में से एक को देखने के बाद, धागा उतना ही समय है। वास्तविक समस्या को खोजने के लिए कुछ कड़ी मेहनत की तरह लग रहा है, लेकिन अब मुझे पता है कि कहां से शुरू करना है, और सवाल निश्चित रूप से उत्तर दिया गया है! – malamut

+0

@malamut अब आप धागे को जानते हैं, शायद नियमित थ्रेड डंप ('jstack ') मदद कर सकते हैं। वे एक सुरक्षित बिंदु की प्रतीक्षा भी करते हैं, इसलिए इस सहायता के साथ भी समस्या को बताना मुश्किल हो सकता है। मुझे यह जानना अच्छा लगेगा कि समस्या की पहचान करने के बाद समस्या क्या थी। यह एक दिलचस्प सवाल है। –

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