2009-05-14 13 views
14

हाल 10 साल में जब जावा और/या कचरा संग्रहण पर चर्चा, केवल प्रदर्शन दंड है कि मैं रक्षा करने के लिए सक्षम नहीं किया गया है कि कचरा संग्रहण एल्गोरिदम कम या ज्यादा टूट जाता है जब एक में चल रहा है पेजेड मेमोरी आर्किटेक्चर, और ढेर के कुछ हिस्सों को बाहर निकाल दिया जा रहा है।JVM कचरा संग्रहण और एक पेजिंग स्मृति वास्तुकला

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

मुझे पता है कि अधिकतम अभ्यास भौतिक स्मृति से कम ढेर को कम रखना है। (या आप अपने एप्लिकेशन को मृत्यु के लिए स्वैप देखेंगे) लेकिन विचार - कम से कम यूनिक्स दुनिया में, यह है कि मेमोरी फाइल सिस्टम कैश इत्यादि के लिए बेहतर खर्च किया जा सकता है।

मेरा प्रश्न है: क्या कोई पेजिंग (जागरूक है) कचरा एल्गोरिदम इकट्ठा?

+0

मामले मैं भी अक्सर मारा जब एक आवेदन है कि बंद हो रहा है कुछ वस्तुओं आवंटित करता है और फिर एक पूर्ण जीसी बस के रूप में यह बाहर निकलने है करता है। उस मामले पर विचार करें जिसे मैंने पीसी पेजिंग के कारण बाहर निकलने के लिए कहा है !! –

+0

एक असली दुनिया हालांकि एज केस: 4 जीबी लैपटॉप क्रैशप्लान का उपयोग कर 3TB का बैक अप ले रहा है। मुझे यकीन नहीं है कि क्रैशप्लान स्मृति का उपयोग कैसे कर रहा है, लेकिन यह जावा का उपयोग करता है, और आसानी से 2 जीबी सक्रिय मेमोरी का उपयोग करता है। –

उत्तर

5

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

उच्च स्मृति दबाव के तहत, उनके बेंचमार्क ने जीएनएमएस जावा जीसी का उपयोग करके 160x लंबा कुछ लिया। नए, पृष्ठ-जागरूक जीसी के साथ, बेंचमार्क केवल 1.6 गुना धीमा था। दूसरे शब्दों में, एक उचित ट्यून किए गए जीसी के साथ, 100x प्रदर्शन लाभ होता है।

http://lambda-the-ultimate.org/node/2391

+0

इंटरस्टेसिंग पेपर। – KarlP

4

मैं एक विशेषज्ञ नहीं हूं, लेकिन किसी भी तरह के पीढ़ी के कचरे के संग्रह को कुछ हद तक मदद करनी चाहिए। जिन पृष्ठों को आक्रामक रूप से बदला जा रहा है, उनमें नए लोगों की बजाय पुरानी वस्तुओं को शामिल करने की संभावना है, इसलिए जीसी स्वाभाविक रूप से उन्हें कम से कम स्पर्श करेगा।

मैं काउंटर-प्रश्न पूछूंगा: क्या कोई यूनिक्स पेजिंग एल्गोरिदम है जो कचरा-संग्रह जागरूक है? यदि किसी दिए गए पृष्ठ को नियमित रूप से (यदि लगातार नहीं) आधार पर स्मृति में रखा जा रहा है, तो हो सकता है कि यह अधिक अच्छा कैश के पक्ष में डालने के बाद इतना अच्छा उम्मीदवार न हो ;-)

9

मैं हूं यह कहने के लिए कि यह आपके विचार के रूप में एक बड़ा मुद्दा नहीं है।

यकीन है कि हम एक ही बात का वर्णन कर रहे हैं बनाने के लिए: एक पूरा संग्रह JVM हर पहुंच योग्य वस्तु की पहचान करने वस्तु ग्राफ चलने के लिए आवश्यकता होती है; छोड़ दिया गया कचरा है। ऐसा करने पर, यह एप्लिकेशन ढेर में प्रत्येक पृष्ठ को छूएगा, जिससे प्रत्येक पृष्ठ को स्मृति में गलती हो जाएगी यदि इसे बदल दिया गया हो।

मुझे लगता है कि यह कई कारणों से गैर-चिंता का विषय है: सबसे पहले, क्योंकि आधुनिक जेवीएम पीढ़ी के कलेक्टरों का उपयोग करते हैं, और अधिकांश वस्तुएं युवा पीढ़ियों से बाहर नहीं निकलती हैं, जो लगभग निवासी सेट में होने की गारंटी देती हैं।

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

तीसरा कारण (और अधिक हो सकता है) क्योंकि JVM (कम से कम, सूर्य JVM) एक निशान स्वीप-कॉम्पैक्ट कलेक्टर का उपयोग करता है। तो जीसी के बाद, ढेर में सक्रिय वस्तुएं पृष्ठों की एक छोटी संख्या पर कब्जा करती हैं, फिर से आरएसएस बढ़ती हैं। यह आकस्मिक रूप से स्विंग ऐप्स के लिए मुख्य ड्राइवर है जिसे सिस्टम.gc() को स्पष्ट रूप से कॉल करने के लिए कॉल किया जाता है: ढेर को संकुचित करके, फिर से अधिकतम होने पर स्वैप करने में कम होता है।


इसके अलावा, C/C++ वस्तुओं की है कि ढेर विखंडन पहचान चरम प्राप्त कर सकते हैं, और युवा वस्तुओं, पुराने के बीच छिड़का कर दिया जाएगा ताकि आरएसएस बड़ा हो गया है।

+1

ठीक है, शायद एक बड़ा मुद्दा नहीं है, लेकिन मुझे लगता है कि यह अभी भी एक मुद्दा है, और शायद एक दिलचस्प समस्या भी है। एक "बेहतर" एल्गोरिदम शायद "सबसे खराब केस" परिदृश्यों के लिए अच्छा होगा जहां एक प्रणाली वास्तव में स्मृति से बाहर हो रही है और जल्द ही मौत पर फेंकने जा रही है। उत्तर के लिए Thx। – KarlP

4

यूनिक्स प्रणालियों (और विशेष रूप लिनक्स) बाहर स्मृति आक्रामक पृष्ठों है कि थोड़ी देर के लिए छुआ नहीं किया गया है, और जब तक कि आपके औसत लीक ग आवेदन के लिए अच्छा है, यह स्मृति तंग स्थितियों में Javas कार्यक्षमता मार डालते हैं।

ध्यान रखें कि यह आम तौर पर एक ट्यूनेबल सेटिंग है - उदाहरण के लिए लिनक्स कर्नेल के लिए vm.swappiness। यदि आप लिनक्स पर स्वैप-ट्यूनिंग के बारे में गहराई से जानकारी चाहते हैं तो आप a blog article I wrote on this पढ़ सकते हैं।

क्या कोई पेजिंग (जागरूक) कचरा एल्गोरिदम एकत्रित कर रहा है?

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

0

इस दिन और उम्र में, पेजिंग प्रोग्राम वास्तव में एक बुरा विचार है। मेमोरी बहुत सस्ता है।

एफडब्ल्यूआईडब्लू, अगर आप किसी ऐसे निर्माता से पीसी पर चल रहे हैं जो स्मृति के लिए बाधाओं पर कई बार चार्ज करना पसंद करता है, तो विंडोज विस्टा में एक अनुमानित पेजिंग एल्गोरिदम है जो काफी अच्छी तरह से काम करता है (शायद एकमात्र चीज जो ओएस अच्छी तरह से करती है) ।

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