मैं अपने खुद के पास एक ट्रिगर के लिए लागू किया टी कुछ ऐसा जो कचरा संग्रह की स्थिर मात्रा का कारण बन सकता है। पूर्ण कोड यहाँ उपलब्ध है: 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()
और थ्रेड द्वारा आवंटित बाइट्स की कुल संख्या है।
नियंत्रण (0% मंथन) अनिवार्य रूप से किसी भी जीसी परिचय नहीं करना चाहिए, और हम इसे शायद ही कोई वस्तुओं आवंटित और धागे में अपने समय के लगभग 100% खर्च करता है देख सकते हैं। 5% से 95% मंथन से हम काफी लगातार देखते हैं कि थ्रेड में लगभग दो तिहाई खर्च किया जाता है, संभवतः अन्य तीसरा जीसी में खर्च किया जाता है। एक उचित प्रतिशत, मैं कहूंगा। दिलचस्प बात यह है कि मंथन प्रतिशत के बहुत ही उच्च अंत में हम धागे में अधिक समय व्यतीत करते हैं, संभवतः क्योंकि जीसी इतनी सफाई कर रहा है, यह वास्तव में अधिक कुशल होने में सक्षम है। ऐसा लगता है कि प्रत्येक चक्र को मंथन करने के लिए लगभग 20% वस्तुओं की एक अच्छी संख्या है।
यह भूखंडों कैसे नक्शा और सूचियों के लिए भिन्न लक्ष्य आकारों में धागा काम करता है, हम आकार बढ़ता है और अधिक समय जीसी में खर्च किया जाना चाहिए के रूप में देख सकते हैं, और दिलचस्प है कि हम वास्तव में कम वस्तुओं का आवंटन अंत
, क्योंकि बड़े डेटा आकार का मतलब है कि यह उसी अवधि में कई लूप बनाने में असमर्थ है। चूंकि हम जीसी मंथन की मात्रा को अनुकूलित करने में रुचि रखते हैं, इसलिए जेवीएम को सौदा करना पड़ता है, हम चाहते हैं कि इसे जितनी संभव हो उतनी वस्तुओं से निपटने की आवश्यकता हो, और काम करने वाले धागे में जितना संभव हो उतना समय बिताएं।ऐसा लगता है कि लगभग 4-500 एक अच्छा लक्ष्य आकार है, इसलिए, यह बड़ी संख्या में वस्तुओं को उत्पन्न करता है और जीसी में काफी समय बिताता है।
ये सभी परीक्षण मानक java
सेटिंग्स के साथ किए गए थे, इसलिए ढेर के साथ खेलना अलग-अलग व्यवहार का कारण बन सकता है - विशेष रूप से, ~ 2000 अधिकतम आकार था जिसे मैं ढेर से पहले सेट कर सकता था, यह संभव है कि हम भी देखेंगे यदि हम ढेर के आकार में वृद्धि करते हैं तो बेहतर परिणाम बड़े आकार में होते हैं।
धन्यवाद, स्टैक ओवरफ़्लो आपको अधिक की आवश्यकता है। –