2013-03-26 5 views
8

के कारण तकनीकें मैं बेंचमार्क की तलाश कर रहा हूं कि चल रहे कचरे के संग्रह की उच्च मात्रा के साथ संघर्ष करते समय कुछ प्रदर्शन करता है। मैंने पहले बेंचमार्क किया है कि यह एक स्थिर, सिंगल-थ्रेडेड रन में कैसे व्यवहार करता है, और अब मैं एक ही परीक्षण को अधिक तनाव वाले जेवीएम में करना चाहता हूं; अनिवार्य रूप से मैं पृष्ठभूमि धागे को उचित रूप से लगातार गति से वस्तुओं को बनाने और नष्ट करना चाहता हूं।लगातार जीसी चर्न

मैं एक स्थिर अभी तक जीसी-गहन ऑपरेशन को कार्यान्वित करने के सुझावों की तलाश में हूं।

  • जीसी
  • में समय की एक सभ्य राशि (जैसे कि, 20-50%) खर्च समय के साथ काम का एक लगभग लगातार राशि, और काम का एक इसी तरह लगातार राशि बनाने के लिए: यह कई लक्ष्यों को पूरा करने की जरूरत है जीसी
  • बचें ढेर बाढ़ और जीसी अधिक भार एक Java heap space त्रुटि ट्रिगर
  • बचें और एक GC overhead limit exceeded त्रुटि
+0

धन्यवाद, स्टैक ओवरफ़्लो आपको अधिक की आवश्यकता है। –

उत्तर

11

मैं अपने खुद के पास एक ट्रिगर के लिए लागू किया टी कुछ ऐसा जो कचरा संग्रह की स्थिर मात्रा का कारण बन सकता है। पूर्ण कोड यहाँ उपलब्ध है: https://bitbucket.org/snippets/dimo414/argzK

मांस इन दोनों तरीकों है, जो निर्माण और वास्तविक समय की एक निश्चित अवधि के लिए वस्तुओं की एक बड़ी संख्या को रिहा (के रूप में समय या CPU समय थ्रेड के खिलाफ):

/** 
* Loops over a map of lists, adding and removing elements rapidly 
* in order to cause GC, for runFor seconds, or until the thread is 
* terminated. 
*/ 
@Override 
public void run() { 
    HashMap<String,ArrayList<String>> map = new HashMap<>(); 

    long stop = System.currentTimeMillis() + 1000l * runFor; 
    while(runFor == 0 || System.currentTimeMillis() < stop) { 
     churn(map); 
    } 
} 

/** 
* Three steps to churn the garbage collector: 
* 1. Remove churn% of keys from the map 
* 2. Remove churn% of strings from the lists in the map 
*  Fill lists back up to size 
* 3. Fill map back up to size 
* @param map 
*/ 
protected void churn(Map<String,ArrayList<String>> map) { 
    removeKeys(map); 
    churnValues(map); 
    addKeys(map); 
} 

कक्षा Runnable लागू करती है ताकि आप इसे अपने स्वयं के पृष्ठभूमि धागे में (या कई बार) शुरू कर सकें। जब तक आप निर्दिष्ट करते हैं, तब तक यह चल जाएगा, या यदि आप चाहें तो आप इसे डिमन थ्रेड के रूप में शुरू कर सकते हैं (इसलिए यह JVM को समाप्त करने से नहीं रोकता है) और इसे 0 सेकेंड के साथ हमेशा के लिए चलाने के लिए निर्दिष्ट करें।


मैं इस वर्ग के कुछ बेंच मार्किंग किया था और पाया कि वह अपने समय को अवरुद्ध (जीसी पर शायद) और 15-25% मंथन की पहचान लगभग इष्टतम मूल्यों का एक तिहाई और ~ 500 के आकार के करीब खर्च किए। com.sun.management.ThreadMXBean.getThreadAllocatedBytes() द्वारा रिपोर्ट किए गए अनुसार, प्रत्येक रन 60 सेकंड के लिए किया गया था, और नीचे दिए गए ग्राफ थ्रेड टाइम प्लॉट करते हैं, जैसा कि java.lang.managment.ThreadMXBean.getThreadCpuTime() और थ्रेड द्वारा आवंटित बाइट्स की कुल संख्या है।

Churn Percentage benchmark

नियंत्रण (0% मंथन) अनिवार्य रूप से किसी भी जीसी परिचय नहीं करना चाहिए, और हम इसे शायद ही कोई वस्तुओं आवंटित और धागे में अपने समय के लगभग 100% खर्च करता है देख सकते हैं। 5% से 95% मंथन से हम काफी लगातार देखते हैं कि थ्रेड में लगभग दो तिहाई खर्च किया जाता है, संभवतः अन्य तीसरा जीसी में खर्च किया जाता है। एक उचित प्रतिशत, मैं कहूंगा। दिलचस्प बात यह है कि मंथन प्रतिशत के बहुत ही उच्च अंत में हम धागे में अधिक समय व्यतीत करते हैं, संभवतः क्योंकि जीसी इतनी सफाई कर रहा है, यह वास्तव में अधिक कुशल होने में सक्षम है। ऐसा लगता है कि प्रत्येक चक्र को मंथन करने के लिए लगभग 20% वस्तुओं की एक अच्छी संख्या है।

Data size benchmark

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

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

ये सभी परीक्षण मानक java सेटिंग्स के साथ किए गए थे, इसलिए ढेर के साथ खेलना अलग-अलग व्यवहार का कारण बन सकता है - विशेष रूप से, ~ 2000 अधिकतम आकार था जिसे मैं ढेर से पहले सेट कर सकता था, यह संभव है कि हम भी देखेंगे यदि हम ढेर के आकार में वृद्धि करते हैं तो बेहतर परिणाम बड़े आकार में होते हैं।

+1

कानूनी लगता है: डी। –

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