2013-05-13 10 views
6

मैं अपने आवेदन में एक अजीब घटना को देख रहा हूं। मैं ऑब्जेक्ट्स को एक सर्वर पर सबमिट करने के बाद हैशमैप में संग्रहीत करता हूं और प्रतिक्रिया मिलने पर उन्हें हटा देता हूं।जावा कचरा संग्रह प्रेरित लेटेंसी प्रदर्शन को प्रभावित करता है

मैंने हाल ही में चलने के बाद बहुत धीमी प्रदर्शन देखा। जांच करने पर, मैंने पाया कि स्मृति उपयोग 4 जीबी पर रहता है और फिर 1 जीबी से कम हो जाता है। मुझे संदेह है कि यह बहुत सारी वस्तुओं को साफ कर रहा है, यही कारण है कि प्रदर्शन इतना खराब हो जाता है।

तो सवाल यह है कि जावा को कचरा संग्रहण में इतनी देर क्यों ले रही है? यही कारण है कि ढेर भरने तक प्रतीक्षा करें और फिर कचरा संग्रह करें? इसे नियमित अंतराल पर कचरा इकट्ठा नहीं करना चाहिए।

हैश मैप में संग्रहीत वस्तुओं को उस समय सही बनाया जाता है, यह कि वे लंबे समय तक नहीं रहते हैं।

यह लिनक्स (आरएचईएल), ओरेकल जेवीएम हॉटस्पॉट 7. 64-बिट पर है। 4 कोर

java -jar -Xmx4g prog.jar

नोट:: यह कैसे अनुप्रयोग चलाने है मैं इस देखा है: Tuning garbage collections for low latency लेकिन अब के लिए मैं समझने के लिए क्यों जी सी में किक करने इतने लंबे समय ले जा रहा है करना चाहते हैं?

+2

क्या झंडे हैं आप प्रोग्राम के साथ चल रहे हैं? – FDinoff

+0

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

+0

@FDinoff डिफ़ॉल्ट के अलावा कोई झंडे नहीं। मूल रूप से, जावा -jar prog.jar। –

उत्तर

3

ऐसा लगता है कि आप दो मुद्दों में से एक चल रहा है: (। जैसे हॉटस्पॉट पर Mark-Compact generation को)

  1. आप अर्द्ध लंबे वस्तुओं से रह रहे हैं, तो वे बड़े कुछ करने के लिए युवा पीढ़ी से ले जाया जाएगा यही है, वे संग्रह के लिए संदर्भित संदर्भ होने से रोकेंगे और एक धीमी जीसी के लिए बनाए रखा जाना शुरू कर देंगे।
  2. आपकी युवा पीढ़ी के ढेर की जगह आपके उपयोग पैटर्न के लिए बहुत छोटी है जो वस्तुओं को युवाओं से पुरानी पीढ़ी में स्थानांतरित करने के लिए मजबूर करती है।

मैं आपकी युवा पीढ़ी को बड़ा होने के लिए ट्यूनिंग देखना चाहता हूं। Generational Garbage Collection देखें और विभिन्न प्रकार की पीढ़ियों को देखें।

+0

में जी 1 कलेक्टर पर एक नज़र डालें, जोड़ने के लिए भूल गए: हैश मैप में संग्रहीत वस्तुओं को उस समय सही बनाया गया है, यह है कि वे नहीं हैं लंबे समय तक रहते थे। –

1

तो सवाल यह है कि जावा को कचरा संग्रहण में इतनी देर क्यों ले रही है? यही कारण है कि ढेर भरने तक प्रतीक्षा करें और फिर कचरा संग्रह करें? इसे नियमित अंतराल पर कचरा इकट्ठा नहीं करना चाहिए।

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

  • कचरा इकट्ठा जब आप इसे के बहुत सारे मिल गया है, और जब आप कचरा इकट्ठा
  • सब कुछ बंद करो।

(समझने के लिए क्यों, आप कैसे नकल कलेक्टरों काम के तकनीकी विवरण को समझने के लिए ... की जरूरत है)

बेशक

, मतलब है कि आप महत्वपूर्ण रुक जाता है मिलता है।

यदि आप कम विलंबता चाहते हैं, तो आपको एक अलग संग्राहक का उपयोग करने की आवश्यकता है।हालांकि, यह कचरा संग्रह ... और अन्य जीसी से संबंधित ओवरहेड पर खर्च होने वाले वास्तविक CPU समय का एक बड़ा प्रतिशत होता है।


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

0

यह इसलिए है क्योंकि डिफ़ॉल्ट जीसी तब तक शुरू नहीं होता जब तक ढेर भरा न हो जाए।

जेवीएम द्वारा चयनित डिफ़ॉल्ट कचरा कलेक्टर समानांतर जीसी है। इसके लक्ष्य सबसे कम संभव स्टॉप-द-वर्ल्ड विराम के दौरान जितना संभव हो उतना स्मृति मुक्त करना है। यह युवा पीढ़ी में शुरू नहीं होगा जब तक कि ईडन पूर्ण न हो जाए। इसी तरह, यह पुरानी पीढ़ी में शुरू नहीं होगा जब तक कि पूरा नहीं हुआ हो।

यदि आप नियमित रूप से स्मृति को साफ करना चाहते हैं तो आप सीएमएस पर स्विच कर सकते हैं। बस ध्वज -XX:+UseConcMarkSweepGC का उपयोग करें। हालांकि, यह आपके आवेदन पर कुछ ओवरहेड का संकेत देगा। यह एक जीसी रखने की लागत है जो आपके आवेदन को रोक दिए बिना नियमित अंतराल पर चलता है।

तो, योग करने के लिए:

  • समानांतर जीसी, आवेदन रुक जाता है शुरू होता है केवल जब वहाँ कोई अन्य विकल्प

  • सीएमएस आपके आवेदन रोक के बिना समवर्ती चलाता है, कुछ भूमि के ऊपर

  • है

स्रोत: http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html

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